C# 理解文化变异和无知对[A-Za-z]的影响
如果我基于以下模式创建一个C# 理解文化变异和无知对[A-Za-z]的影响,c#,regex,case-insensitive,culture,C#,Regex,Case Insensitive,Culture,如果我基于以下模式创建一个Regex:@“[a-Za-z]+”,如果我已经在使用RegOptions.CultureInvariant,那么它所匹配的集是否会通过添加RegOptions.IgnoreCase而发生变化(由于)?我认为这是一个明显的“不,这只是多余的和重复的”。在我的测试中,这就是我所展示的,但我想知道我是否因为确认偏差而遗漏了什么 如果我在这一点上错了,请纠正我,但我相信我确实需要使用文化变量,因为我也不知道文化会是什么 注意:这不是我需要使用的实际模式,只是其中最简单的关键部
Regex
:@“[a-Za-z]+”
,如果我已经在使用RegOptions.CultureInvariant
,那么它所匹配的集是否会通过添加RegOptions.IgnoreCase
而发生变化(由于)?我认为这是一个明显的“不,这只是多余的和重复的”。在我的测试中,这就是我所展示的,但我想知道我是否因为确认偏差而遗漏了什么
如果我在这一点上错了,请纠正我,但我相信我确实需要使用
文化变量
,因为我也不知道文化会是什么
注意:这不是我需要使用的实际模式,只是其中最简单的关键部分。完整的模式是:@[A-Za-z0-9\s!\\\\\\\\\\\\\\$(),.:=@'\-{}124;&]+“
,以防在符号、案例和文化周围确实存在一些奇怪的行为。不,我没有创建模式,我只是在使用它,无法更改它,我意识到在/&
之前不需要
如果我能改变模式
“[a-z]”
同时具有CultureInvariant
和IgnoreCase
在功能上等同于仅使用
CultureInvariant
正确吗所以我对这一切的运作方式有一个基本的误解。我想这就是让我失望的原因
Regex regex = new Regex("[A-Za-z]", RegexOptions.IgnoreCase);
对于
regex.IsMatch(“ı”)
,将返回false
,但是对于regex.IsMatch(“İ”)
,将返回true
。如果我删除IgnoreCase
它会同时返回false
,如果我使用CultureInvariant
(带或不带IgnoreCase
),它将返回false
,这基本上可以归结为Scott Chamberlain在评论中所说的。谢谢你,斯科特
最终,我希望“İ”和“ı”都被拒绝,我甚至在考虑
CultureInvariant
之前,就把IgnoreCase
加入了这一组合,从而扭转了局面。如果我删除IgnoreCase
并添加CultureInvariant
,那么我可以保持模式不变,并使其与我想要的匹配
如果我能够将模式更改为仅“[A-Z]”
,那么我就可以使用这两个标志并仍然获得所需的行为。但改变模式的一点,哪一个更有效,只是好奇而已。我不想涉及讨论中可能出现的所有问题,以及我可以改变模式的所有方式。我关心的是文化、病例不敏感和这两个RegexOptions
总而言之,我需要放下
IgnoreCase
,然后围绕文化的整个问题就消失了。如果模式是a-z
或a-z
,我需要使用IgnoreCase
匹配上下两个字母,那么我也需要使用CultureInvariant
。使用此程序,我们可以测试所有可能的两个字母序列:
static void Main()
{
var defaultRegexOptions = RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.Singleline;
var regex1 = new Regex(@"^[A-Za-z]+$", defaultRegexOptions);
var regex2 = new Regex(@"^[A-Za-z]+$", defaultRegexOptions | RegexOptions.IgnoreCase);
ParallelEnumerable.Range(char.MinValue, char.MaxValue - char.MinValue + 1)
.ForAll(firstCharAsInt =>
{
var buffer = new char[2];
buffer[0] = (char)firstCharAsInt;
for (int i = char.MinValue; i <= char.MaxValue; i++)
{
buffer[1] = (char)i;
var str = new string(buffer);
if (regex1.IsMatch(str) != regex2.IsMatch(str))
Console.WriteLine("dfjkgnearjkgh");
}
});
}
static void Main()
{
var defaultRegexOptions=RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture | RegexOptions.Singleline;
var regex1=new Regex(@“^[A-Za-z]+$”,defaultRegexOptions);
var regex2=new Regex(@“^[A-Za-z]+$”,defaultRegexOptions | RegexOptions.IgnoreCase);
ParallelEnumerable.Range(char.MinValue、char.MaxValue-char.MinValue+1)
.ForAll(firstCharAsInt=>
{
var buffer=新字符[2];
缓冲区[0]=(char)firstCharAsInt;
for(int i=char.MinValue;iCultureInvariant
对[A-Za-z]
没有影响,因为土耳其语i(或任何其他特定于文化的字符)不在您指定的范围内。可能在所有可能的65536个字符上运行循环?您甚至可以测试所有2个字符序列。我在这里研究答案时发现的轶事证据:表明[a-Za-z]
将比使用RegexOptions更快。IgnoreCase
。您是否考虑过使用中所述的内置类?如果您已经将CultureInvariant
与[A-Za-z]
,更改为[A-z]
(或[A-z]
)添加IgnoreCase
不会改变匹配的符号集。在[a-Z]
和[a-Z]
之间存在一对一的映射。大小写规则也不会影响匹配数字[0-9]
,因为没有大写和小写数字。+1,我意识到对我的问题的大量解释可以产生这样一个务实的答案,我也意识到我的问题可以归结为一个简单的“否”,以回答“它匹配的集合是否通过添加IgnoreCase而改变?”,但正如你所说,它没有提供任何见解,而这正是我所追求的——理解将这些标志与拉丁字母表中已经不区分大小写的字符组合使用的后果。