Regex - как сопоставить 'ß' с 'ss' и наоборот - PullRequest
2 голосов
/ 13 марта 2020

Ребята, как я могу сопоставить регулярное выражение для символа sharp-s (ß) с ss, и наоборот? Я попробовал инвариантную культуру, но она не возвращает совпадение. Однако, если я использую String.IndexOf() с инвариантной культурой, он способен .

Console.WriteLine("abcßßdefßßghi".IndexOf("ssss", StringComparison.InvariantCultureIgnoreCase) >=0);

var matches = Regex.Matches("abcßßdefßßghi", "ssss", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
Console.WriteLine(matches.Count);

// OUTPUT
True
0

Мне нужно найти все индексы, с которых начинается совпадение. Идея состоит в том, чтобы выделить «согласованную» строку. Я ищу чистый подход с Regex.Match(), который предпочтительнее, чем перебор строки и подстроки и так далее. ТИА.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

чтобы преодолеть этот сценарий, я в итоге заменил ß|ss на (ß|ss) в поисковом запросе, а затем выполнил поиск

var cleanSearchTerm = Regex.Replace(Regex.Escape(RemoveDiacritics(searchTerm)), "ß|ss", "(ß|ss)", RegexOptions.IgnoreCase);
var matches = Regex.Matches(RemoveDiacritics(item), cleanSearchTerm, RegexOptions.IgnoreCase );

, что даст совпадения для ß и ss в поисковом запросе, содержащем ß и / или ss

0 голосов
/ 14 марта 2020

Вероятно, это не тот ответ, на который вы надеялись, но, посмотрев немного на него, похоже, не найдется решения, которое опирается на RegexOptions. Даже явное указание CurrentCulture на de-DE и удаление RegexOptions.CultureInvariant дает неверные результаты. Поскольку это работает с IndexOf(), я бы посчитал это ошибкой в ​​библиотеке Regex.

Учитывая, что наилучшим обходным решением может быть явная обработка обоих сценариев ios с помощью оператора чередования (|):

var matches = Regex.Matches("abcdßẞsSSs", "(ss|ß)", RegexOptions.IgnoreCase);

По иронии судьбы, это работает со всеми нейтральными и спецификами c культур, т. Е. Не только de-DE и de, но даже ja-JP и ja. Тем не менее, на удивление, он потерпит неудачу с инвариантной культурой, которая не оценивает ß и как эквивалентные. Таким образом, если вам нужно работать в инвариантной культуре - или, по крайней мере, вам нужно использовать RegexOptions.CultureInvariant - тогда вам нужно будет использовать следующее:

var matches = Regex.Matches("abßßcdẞẞefsSsSghij", "(ss|ẞ|ß)", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);

Опять же, это, вероятно, не ответ, который вы ищете, и может оказаться немного сложным для объединения с более сложными регулярными выражениями, но это лучшее, что я смог придумать, учитывая очевидные ограничения библиотеки RegEx от Microsoft.

...