C# RegexOptions.CultureInvariant未找到口音匹配项
我想创建一个忽略重音的正则表达式 例如:C# RegexOptions.CultureInvariant未找到口音匹配项,c#,regex,C#,Regex,我想创建一个忽略重音的正则表达式 例如: string s = "I am an old élephant"; string pattern = "elephant"; bool result = new Regex(pattern, RegexOptions.CultureInvariant).IsMatch(s); 我的测试文化是: System.Globalization.CultureInfo.CurrentCulture = Fr-fr 所以我本以为这段代码会找到匹配项,但事实并非
string s = "I am an old élephant";
string pattern = "elephant";
bool result = new Regex(pattern, RegexOptions.CultureInvariant).IsMatch(s);
我的测试文化是:
System.Globalization.CultureInfo.CurrentCulture = Fr-fr
所以我本以为这段代码会找到匹配项,但事实并非如此
有没有一个简单的方法可以找到匹配的
我正在尝试创建一个StringReplace重载方法,用elephant替换élèph–nt等等。您正在指定一个CultureInvariant正则表达式。这意味着你的文化被忽略了。所以你要么删除这个选项
bool result = new Regex(pattern).IsMatch(s);
…或者,如果您想独立于文化,请扩展您的模式:
string pattern = "[eé]lephant";
使用以下方法:
public string removeDiacritics(string str)
{
var sb = new StringBuilder();
foreach (char c in str.Normalize(NormalizationForm.FormD))
{
if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
{
sb.Append(c);
}
}
return sb.ToString().Normalize(NormalizationForm.FormC);
}
那就行了
string s = "I am an old élephant";
string pattern = "elephant";
bool result = new Regex(pattern, RegexOptions.IgnoreCase).IsMatch(removeDiacritics(s)); //true
如果必须替换某些内容,例如通过matchcollection进行迭代(向后),并根据每个匹配的索引编辑原始字符串
解释:(我用的是“我是一个老的”字串)
让我们将原始字符串的所有字符写入一个列表:
foreach (char c in str)
{
chars1.Add(c);
}
如您所见,字符定义为unicode字符233或00E9(请参阅)
这里解释了标准化
正如文件所说:
表格D:
这意味着字符被“拆分”为e和重音字符
要检查这一点,让我们输出归一化字符串的字符:
List<char> chars2 = new List<char>();
foreach(char c in str.Normalize(NormalizationForm.FormD))
{
chars2.Add(c);
}
List chars2=新列表();
foreach(str.Normalize(NormalizationForm.FormD)中的字符c)
{
第2条.加入(c);
}
如表中所示,é现在被标准化为2个字符(101(\u0065)+769(\u0301))
现在我们必须消除这些口音:
迭代归一化字符串的所有字符,如果是“非间隔标记”,则将其添加到StringBuilder
MSDN:
不间断标记
指示基字符修改的非空格字符。
由Unicode名称“Mn”(标记,非空格)表示。这个
值为5
最后,为了确保所有其他字符(现在在字符串中定义为2或3个字符)都“转换”为unicode字符符号,我们必须将新字符串规范化回FormC
MSDN:
表格C:
指示Unicode字符串使用完全规范化
分解,然后用其
初级复合材料,如有可能
如果要使用正则表达式,可以使用
\p{L}
来声明给定的unicode字符是字母
string s = "I am an old ùûüÿàâçéèêëïîô";
string pattern = @"(\p{L})";
var regex = new Regex(pattern);
var result = regex.Replace(s, @"$1");
Console.WriteLine(result);//I am an old uuuyaaceeeeiio
“测试时我的区域性”不相关,因为您指定了
RegexOptions.CultureInvariant
@A.D。请查看默认值,如果没有RegexOptions.CultureInvariant,它将不起作用。我的理解是RegexOptions.CultureInvariant标记将使其匹配,但我误解了.string pattern=“[eé]lephant”;这不是我要寻找的,因为我正在寻找一种通用方法,以便在比较带重音的字符串和不带重音的字符串时找到匹配项。实际上,我正在尝试创建一个StringReplace重载方法,该方法将用elephant等替换élèph–nt。您可以在那里指定您的区域性。正则表达式将帮助您精确匹配;对于文化敏感的搜索,它不是很有用。你也应该更新你的问题以提供这类信息,否则你将得不到你想要的。那会有用的。Thx for this:)@user1519999:也许你应该详细说明一下它的工作原理。我明白你在做什么,但我不确定每个人都知道…@Sefe done.)美好的
string s = "I am an old ùûüÿàâçéèêëïîô";
string pattern = @"(\p{L})";
var regex = new Regex(pattern);
var result = regex.Replace(s, @"$1");
Console.WriteLine(result);//I am an old uuuyaaceeeeiio