如何使用.net匹配Unicode字符?

got*_*tqn 3 .net c# regex unicode linqpad

我想使用正则表达式匹配Unicode字符.我发现这可以使用Unicode类别或块或更准确地使用这些Unicode类别支持的命名块.

问题是我无法使其正常使用LINQPAD 4Regex.IsMatch运行.例如,尝试匹配一个简单的拉丁字符,如下所示:

Console.WriteLine(Regex.IsMatch("d", @"[\0000-\007F]+"));
Run Code Online (Sandbox Code Playgroud)

引发以下错误:

ArgumentException4以相反的顺序解析"[\ 0000-\007F] +" - [xy]范围.

并使用这个:

Console.WriteLine(Regex.IsMatch("d", @"\L{IsBasicLatin}{1}"));
Run Code Online (Sandbox Code Playgroud)

给我:

解析"\ L {IsBasicLatin} {1}" - 无法识别的转义序列\ L.

在我的实际案例中,我将替换IsLatinIsCyrillic,但我需要使它与拉丁语一起使用以确保它是OK.

谁能说出我做错了什么?

Wik*_*żew 6

您正在使用字符的八进制表示而不是十六进制,这会创建一个无效的范围(因为首先,它\000被解析为八进制字符,然后0-\007遇到并导致错误,因为0有一个32十进制代码).

使用\x\u表示法,例如:

[\x00-\x7F]+
Run Code Online (Sandbox Code Playgroud)

这将捕获整个ASCII范围以及控制字符(包括NULL符号).

第二个问题,您需要使用\p脚本名称,例如

\p{IsBasicLatin}
Run Code Online (Sandbox Code Playgroud)

在此处查看有关Unicode类别的更多信息.