C# 为什么这个正则表达式返回true?

C# 为什么这个正则表达式返回true?,c#,regex,unicode,globalization,arabic,C#,Regex,Unicode,Globalization,Arabic,为什么这个正则表达式返回true Regex.IsMatch("العسكرية", "العسكري") 我在谷歌上搜索了一下,什么也没找到。我怀疑你发布的内容实际上是相反的,较短的文本实际上是模式,较长的输入是匹配的输入。在这种情况下,这将返回true,因为模式匹配单词中除最后一个字母以外的所有内容 要澄清的是,是模式,是输入。因为我懂阿拉伯语,所以我可以告诉你,后者确实是前者的部分匹配,所以如果这些值实际上是相反的,那么结果将是真实的。如果你提到,你可以看到字母yā(在表格底部)与问题中

为什么这个正则表达式返回true

Regex.IsMatch("العسكرية", "العسكري")

我在谷歌上搜索了一下,什么也没找到。

我怀疑你发布的内容实际上是相反的,较短的文本实际上是模式,较长的输入是匹配的输入。在这种情况下,这将返回true,因为模式匹配单词中除最后一个字母以外的所有内容

要澄清的是,
是模式,
是输入。因为我懂阿拉伯语,所以我可以告诉你,后者确实是前者的部分匹配,所以如果这些值实际上是相反的,那么结果将是真实的。如果你提到,你可以看到字母yā(在表格底部)与问题中的字母相同。它的出现取决于它在单词中出现的位置。在前一个单词中,它出现在末尾,在后一个单词中,它是最后的第二个字母

当我从您的帖子中复制/粘贴时,这些值会被反转,从而得到一个真实值。为了更好地处理此问题,我们可以将单词分开,以查看两种情况下的预期结果:

string first = "العسكري";
string second = "العسكرية";
Console.WriteLine(Regex.IsMatch(first, second)); // false
Console.WriteLine(Regex.IsMatch(second, first)); // true

似乎
Regex.IsMatch()
告诉我们字符串中是否存在Regex,而不是整个字符串与Regex匹配(根据文档,它是“”)。第一个参数是输入,另一个是文档中的模式,但这里似乎是另一种方式。最后一个(最左边的)字符看起来像两个字符串中的另一个字符,但这可能是因为连字的呈现方式。当转储为UTF-8字节时,字符串为:

d8 a7 d9 84 d8 b9 d8 b3 d9 83 d8 b1 d9 8a


因此,第一个实际上是另一个的子字符串,它将解释匹配(它确实要求参数顺序实际上与文档所述相反)。

这是为散文而不是代码设计的文本呈现规则的有趣结果

如上所述,方法调用中的第一个参数是“العسكية”,即右侧呈现(*)的参数。这个较长的参数是输入,左侧呈现的较短的子字符串实际上是模式,因此匹配

(*:这是假设您的浏览器知道如何从右向左呈现。如果您将代码片段粘贴到不支持复杂文本布局的编辑器或控制台中,您将看到它的真实面目…尽管阿拉伯语将被破坏。)

诀窍在于标点符号(如引号和逗号)是无方向的,因此可以根据环境从左到右或从右到左渲染。代码段的逻辑顺序为:

>>>>>>>>>>>>>>>
               <<<<<<<<<<<<<<<<<<<
                                  >>
Regex.IsMatch("العسكرية", "العسكري")

这在功能上与原始代码相同,但显示方式却截然不同。您可以在键入第一个拉丁字母时观察参数的位置交换位置。

我不熟悉阿拉伯语,但既不熟悉
新文化信息(“ar”)。也不熟悉
新文化信息(“ar”)。CompareInfo.IsPrefix
也不熟悉
新文化信息(“ar”).CompareInfo.IsSuffix
为两个字符串返回
true
。@dtb奇怪的是,当我从OP的帖子粘贴时,我得到了true,尽管如我所说,这些值是反向的,提供了部分匹配。@dtb我使用示例代码中的变量得到了true:
新文化信息(“ar”)。CompareInfo.IsPrefix(第二,第一)
-你明白了吗?是的;当我第一次复制字符串时,一定是出了什么问题。回答得好,+1。@dtb字符串匹配不是文化问题。要么是相同的字符,要么不是。哎哟!!不显示字节,不显示字节,不显示字节,显示Unicode字符,如<代码>Regex.IsMatch(“\x{627}{627}\x{644}\x{639}}\x{633}\x{633}{3{3}不显示字节,不显示Unicode字符,如<代码>Regex..字符字符,如<编码>Regex.Regex.ISMi0.0 0 0 0.7}\0{644}\0{4}\0 0{6}\0 0{6}\0 0 0 0{{{639}\0}\0}\0 0 0 0 0{{{{639}\0}\0}\0}\3}\x{{{{633}\3}\3}\3}\3}\3}\0}\0}\0}\0{{{{{{{{{阿拉伯文字母LAM}\N{阿拉伯文字母AIN}\N{阿拉伯文字母SEEN}\N{阿拉伯文字母KAF}\N{阿拉伯文字母REH}\N{阿拉伯文字母YEH}\N{阿拉伯文字母TEH MARBUTA},“\N{阿拉伯文字母ALEF}\N{阿拉伯文字母LAM}\N{阿拉伯文字母AIN}\N{阿拉伯文字母SEEN}\N{阿拉伯文字母KAF}\N{阿拉伯文字母REH}\N{阿拉伯文字母YEH}”)
有显示这些表格的简单工具。
>>>>>>>>>>>>>>>
               <<<<<<<<<<<<<<<<<<<
                                  >>
Regex.IsMatch("العسكرية", "العسكري")
Regex.IsMatch("العسكرية", /* foo */ "العسكري")