各位,我如何在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-DE
和de
,甚至是ja-JP
和ja
。也就是说,令人惊讶的是,它将在不变量文化中失败,该文化不将ß
和ẞ
视为等效。因此,如果您需要在不变区域性下运行——或者至少需要使用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
的匹配