【问题标题】:Regex - how to match 'ß' to 'ss' and vice versa正则表达式 - 如何将 'ß' 与 'ss' 匹配,反之亦然
【发布时间】:2020-03-13 19:12:12
【问题描述】:

伙计们,我怎样才能对 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。

【问题讨论】:

  • 出于搜索引擎优化的目的,Sharp-s 字符(ß)也称为 Eszett。对于那些不熟悉 sharp-s 字符的人来说,它的发音类似于ss,并且两者在书面德语中可以互换使用——因此在解析时需要能够将它们视为同义词一个字符串。 (ß 在技术上更正确,但并非所有字体都支持它。)
  • 有趣的问题。而且,我很尴尬地承认,我至少能想到三个我编写本地化代码的案例,但我没有考虑到这一点。出于好奇,如果您将文化明确设置为CurrentCultureIgnoreCase,并且当前的CultureInfo 设置为例如,这是否有效? de-DE?

标签: c# regex localization cultureinfo


【解决方案1】:

这可能不是您希望的答案,但是在研究了一会儿之后,似乎没有依赖于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 库的限制。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这与我一个月前提供的答案基本相同。今后,请仅接受现有答案,而不是将核心指导重新发布为新答案。
    猜你喜欢
    • 2021-04-05
    • 2020-07-25
    • 1970-01-01
    • 2012-12-19
    • 2011-06-07
    • 2015-01-16
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    相关资源
    最近更新 更多