Intereting Posts
Проблемы с библиотекой при компиляции приложения IOS Как продолжить drawRect: при нажатии на экран Как использовать NSTextView в блоке? Воспроизведение защищенного паролем .m3u аудиопотока с помощью AVPlayer или аналогичного Подготовить для segue автозапуск Использование NSOperatonQueue для ускорения вычисления Как CGRectEdge можно использовать для установки краев прямоугольника? Действительно ли раскадровки хорошо масштабируются с помощью модульного тестирования? Невозможно получить уведомление FCM на каком-либо устройстве в iOS Переместить ярлык с помощью UISlider Сохранять данные из текстового файла в массиве и / или словаре Раскадровка для разработки заставки Неизменяемое значение «Struct» имеет только мутирующие члены с именем «Function» Swift 3 Error UILabel: использование CGColor для свойств цвета или внутренних атрибутов не поддерживается Как реализовать защиту данных iOS в приложении iOS 8 по XCode 6.1 project-> target-> Capabilities-> Data Protection?

Можно ли игнорировать символы в строке при сопоставлении с регулярным выражением

Я хотел бы создать регулярное выражение, чтобы при сравнении строки с массивом строк совпадения возвращались с регулярным выражением, игнорирующим определенные символы.

Вот один пример. Рассмотрим следующий массив имен:

{ "Andy O'Brien", "Bob O'Brian", "Jim OBrien", "Larry Oberlin" } 

Если пользователь вводит «ob», я бы хотел, чтобы приложение применило предикат регулярного выражения к массиву, и все имена в указанном выше массиве будут соответствовать (например, «игнорируется»).

Я знаю, что я могу выполнить совпадение дважды, сначала против каждого имени, а второй против каждого имени с игнорируемыми символами, лишенными строки. Я предпочел бы это, выполнив одно регулярное выражение, так что мне не нужны два прохода.

Это возможно? Это для приложения iOS, и я использую NSPredicate.

EDIT: разъяснение по использованию

Из первых ответов я понял, что я не понял. Приведенный выше пример является конкретным. Мне нужно общее решение, в котором массив имен представляет собой большой массив с разными именами, и строка, которую я сопоставляю, вводится пользователем. Поэтому я не могу жестко закодировать регулярное выражение, например [o] '? [B].

Кроме того, я знаю, как делать нечувствительные к регистру поиски, поэтому не нужно отвечать, чтобы сосредоточиться на этом. Просто нужно решение, чтобы игнорировать символы, с которыми я не хочу сопоставлять.

Поскольку вы отбросили все ответы, показывающие, как это можно сделать, вы останетесь с ответом:

НЕТ, это невозможно. В Regex нет возможности «игнорировать» символы. Ваши единственные варианты – изменить регулярное выражение, чтобы соответствовать им, или сделать проход по исходному тексту, чтобы избавиться от символов, которые вы хотите игнорировать, а затем сопоставить с ними. (Конечно, тогда у вас может возникнуть проблема корреляции вашего «очищенного» текста с фактическим исходным текстом.)

Если я правильно понимаю, вам нужен способ сопоставить символы «ob» 1), независимо от их капитализации, и 2) независимо от того, существует ли между ними апостроф. Это должно быть легко.

1) Используйте модификатор нечувствительности к регистру или используйте регулярное выражение, которое указывает, что допустимы как основная, так и строчная версия письма: [Oo][Bb]

2) Использовать ? чтобы указать, что символ может присутствовать как один, так и нуль. o'?b будет соответствовать как «o'b», так и «ob». Если вы хотите включить другие символы, которые могут или не могут присутствовать, вы можете сгруппировать их с апострофом. Например, o['-~]?b будет соответствовать «ob», «o'b», «ob» и «o ~ b».

Итак, полный ответ будет [Oo]'?[Bb] .

Обновление : ОП запросил решение, которое приведет к игнорированию данного символа в произвольной строке поиска. Вы можете сделать это, вставив '? после каждого символа строки поиска. Например, если вам была дана поисковая строка oleary , вы бы превратили ее в o'?l'?e'?a'?r'?y'? oleary o'?l'?e'?a'?r'?y'? , Foolproof, хотя, вероятно, не оптимальный для производительности. Обратите внимание, что это будет соответствовать «o'leary», но также «o'lea'r'y», если это вызывает беспокойство.

В этом конкретном случае просто переместите набор символов в середину регулярного выражения как необязательный. Это работает специально, потому что у вас есть только два символа в вашей строке соответствия, иначе регулярное выражение может получиться немного подробным. Например, сопоставьте регистр с учетом регистра:

 o[']*b 

Вы можете добавить больше символов в этот класс символов в середине, чтобы игнорировать их. Обратите внимание, что * соответствует любому количеству символов (так что O '' 'Brien будет соответствовать) – для одного экземпляра измените ? :

 o[']?b 

Вы можете сделать специальные символы необязательными с вопросительным знаком, что означает, что он будет соответствовать тому, есть они или нет, например:

 /o\'?b/ 

Сопоставим все вышеперечисленное, добавьте .+ в обе стороны, чтобы соответствовать всем другим символам, и пробел, обозначающий начало фамилии:

 /.+? o\'?b.+/ 

И используйте модификатор нечувствительности к регистру, чтобы он соответствовал независимо от капитализации.