C# 正则表达式-如何匹配'ß';至';ss&x27;反之亦然
伙计们,我怎样才能用C# 正则表达式-如何匹配'ß';至';ss&x27;反之亦然,c#,regex,localization,cultureinfo,C#,Regex,Localization,Cultureinfo,伙计们,我怎样才能用ss对sharp-s字符(ß)进行正则表达式匹配,反之亦然?我尝试了不变区域性,但它没有返回匹配项。但是,如果我将String.IndexOf()与不变区域性一起使用,它就能够 Console.WriteLine(“abcßßdefßghi”.IndexOf(“ssss”,StringComparison.InvariantCultureIgnoreCase)>=0); var matches=正则表达式matches(“abcßßdefßghi”、“ssss”、RegexO
ss
对sharp-s字符(ß
)进行正则表达式匹配,反之亦然?我尝试了不变区域性,但它没有返回匹配项。但是,如果我将String.IndexOf()
与不变区域性一起使用,它就能够
Console.WriteLine(“abcßßdefßghi”.IndexOf(“ssss”,StringComparison.InvariantCultureIgnoreCase)>=0);
var matches=正则表达式matches(“abcßßdefßghi”、“ssss”、RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
Console.WriteLine(matches.Count);
//输出
真的
0
我需要找到比赛开始的所有索引。这样做的目的是突出显示“匹配”字符串。我正在寻找一种使用
Regex.Match()
的干净方法,这比迭代字符串和子字符串等更可取。TIA。这可能不是您希望的答案,但在研究了一段时间后,似乎没有一个解决方案依赖于RegexOptions
。即使将CurrentCulture
显式设置为de
并删除RegexOptions.CultureInvariant
也会产生错误的结果。因为这是用<代码>索引()/<代码>工作的,所以我认为这是代码< > ReXEX <代码>库中的一个bug。
考虑到这一点,最好的解决方法可能是使用交替运算符(|
)显式处理这两种情况:
var matches=Regex.matches(“abcdß”ẞsSSs“,“(ss|ß)”,RegexOptions.IgnoreCase);
具有讽刺意味的是,这适用于所有中立和特定的文化,即不仅是de
和de
,甚至是ja-JP
和ja
。这就是说,令人惊讶的是,它将在不变文化中失败,而不变文化不评估ß
和ẞ代码>作为等效项。因此,如果您需要在不变区域性下运行,或者至少需要使用RegexOptions.CultureInvariant
,那么您需要使用以下内容:
var matches=Regex.matches(“abßßßcdẞẞEFSSGHIJ“,”(ss|ẞ|ß)”,RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
再说一次,这可能不是你想要的答案,与更复杂的正则表达式合并可能会有点复杂,但考虑到微软正则表达式库的明显局限性,这是我所能想到的最好的方法。为了克服这种情况,我最终用(ß|ss)
,然后对其进行查找
var cleanSearchTerm = Regex.Replace(Regex.Escape(RemoveDiacritics(searchTerm)), "ß|ss", "(ß|ss)", RegexOptions.IgnoreCase);
var matches = Regex.Matches(RemoveDiacritics(item), cleanSearchTerm, RegexOptions.IgnoreCase );
这将在包含ß
和/或ss
的搜索词中为ß
和ss
提供匹配,以便搜索引擎优化,夏普-s字符(ß
,ẞ代码>)也被称为Eszett。对于那些不熟悉sharp-s字符的人来说,它的发音类似于ss
,这两个字符在书面德语中可以互换使用,因此在解析字符串时需要能够将它们视为同义词。(ß
在技术上更正确,但并非所有字体都支持它。)有趣的问题。而且,我很不好意思承认,我至少可以想到三种情况,我编写的本地化代码没有考虑到这一点。出于好奇,如果您明确地将区域设置为CurrentCultureInogoreCase
,并且当前的CultureInfo
设置为例如de
,这是否有效?