正则表达式 - 如何将 'ß' 与 'ss' 匹配,反之亦然

Regex - how to match 'ß' to 'ss' and vice versa

伙计们,我怎样才能用 sharp-s 字符 (ß) 与 ss 进行正则表达式匹配,反之亦然?我尝试了不变区域性,但 return 不匹配。但是,如果我将 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

我需要找到匹配开始的所有索引。这个想法是突出显示 'matched' 字符串。我正在寻找一种使用 Regex.Match() 的干净方法,这比遍历字符串和子字符串等更可取。 TIA.

这可能不是您希望得到的答案,但在仔细研究之后,似乎没有依赖于 RegexOptions 的解决方案。即使明确地将 CurrentCulture 设置为 de-DE 并删除 RegexOptions.CultureInvariant 也会产生不正确的结果。由于这适用于 IndexOf(),我认为这是 Regex 库中的错误。

鉴于此,最好的解决方法可能是使用交替运算符 (|) 显式处理这两种情况:

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

有点讽刺的是,这适用于所有中性特定文化——即,不仅仅是de-DEde,甚至 ja-JPja。也就是说,令人惊讶的是,它会因 invariant 文化而失败,它不会将 ß 评估为等效的。因此,如果您需要 运行 在不变文化下——或者至少需要使用 RegexOptions.CultureInvariant——那么您将需要使用以下内容:

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

同样,这可能不是您正在寻找的答案,并且与更复杂的正则表达式合并可能会有点复杂,但这是我能想到的最好的答案Microsoft 的 RegEx 库的明显局限性。

为了克服这种情况,我最终将搜索词中的 ß|ss 替换为 (ß|ss),然后对其进行查找

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

这将在包含 ß and/or ss

的搜索词中给出 ßss 的匹配项