正则表达式 - 如何将 'ß' 与 '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-DE
和de
,甚至 ja-JP
和 ja
。也就是说,令人惊讶的是,它会因 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
的匹配项
伙计们,我怎样才能用 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-DE
和de
,甚至 ja-JP
和 ja
。也就是说,令人惊讶的是,它会因 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
的匹配项