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



各位,我如何在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()的干净方法,它比迭代字符串和子字符串等更可取。TIA。

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

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

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

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

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

同样,这可能不是你想要的答案,而且与更复杂的正则表达式合并可能会有点复杂,但考虑到微软RegEx库的明显局限性,这是我能想到的最好的方法。

为了克服这种情况,我最终在搜索项中将ß|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的匹配

相关内容

  • 没有找到相关文章

最新更新