Regex для сравнения строк со специальными символами и без - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь создать регулярное выражение для сравнения строк.Регулярное выражение: .*\bword.*

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

Например:

O'Reillyдолжны соответствовать O'Reilly и oreilly

Можно ли сделать это с регулярным выражением?

PS

Это должно использоваться в iOS с NSPredicate.В настоящее время предикат выглядит следующим образом:

NSString *regexString = [NSString stringWithFormat:@".*\b%@.*", word];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K matches[cd] %@", keypath, regexString];

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

1 Ответ

0 голосов
/ 03 декабря 2018

Вы можете подумать о предварительной обработке вашей строки перед выполнением сопоставления.Если у вас есть список допустимых символов, который в вашем примере представляет собой только az и AZ, вы можете использовать оператор транслитерации tr///, чтобы удалить все остальные символы, и lc, чтобы указать строчную строку.Флаги на tr c дополняют совпадение, т. Е. Сопоставляют все, что не указано в списке, и d удаляют все совпадения, которые не имеют замены, поскольку замена пуста, что означает все совпадения.

$string =~ tr/a-zA-Z//cd;
$string = lc $string;

Если вы используете символы вне диапазона ASCII, вам нужно быть немного умнее.

$string =~ s/\P{L}+//g;
$string = fc $string;

Прежде всего мы используем регулярное выражение, чтобы удалить любой символ Unicode, который не входит в общийПисьмо категории.И затем мы используем функцию fc, чтобы сложить регистр строки, это та же самая функция, которую Perl использует для сопоставления регулярных выражений без учета регистра.Обратите внимание, что вы можете сначала нормализовать строку.

...