C#正则表达式中的外语字符

19
在C#代码中,我正在尝试传递中文字符:" 中文ABC123"
当我使用一般的字母数字组合" ^[a-zA-Z0-9\s]+$"时,
对于"中文ABC123"无法通过,正则表达式验证失败。
我需要添加哪些其他表达式用于C#?
2个回答

44

为了匹配来自任何语言的任何字母字符,请使用:

\p{L}

如果您也想匹配数字:

[\p{L}\p{Nd}]+

\p{L} 匹配一个Unicode字母字符。
                它是 [\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}] 的简写形式。
                \p{Ll} 匹配小写字母。(abc)
                \p{Lu} 匹配大写字母。(ABC)
                \p{Lt} 匹配标题大小写的字母。
                \p{Lm} 匹配修饰符字母。
                \p{Lo} 匹配没有大小写的字母。 (中文)

\p{Nd} ... 匹配一个Unicode十进制数字。

只需要将: ^[a-zA-Z0-9\s]+$ 替换为 ^[\p{L}0-9\s]+$


或者,如果标点符号没问题,可以使用更简单的\w单词字符)代替[\p{L}0-9] - bzlm
1
顺便提一下,Andie2302,这个问题与HTML5 Pattern存在巨大冲突,我试图使用HTML5 pattern属性进行验证,但失败了。你有什么想法可以解决所有语言的HTML5 Pattern属性问题吗? - user2683269
6
JavaScript(以及因此 html5 输入模式)不支持\p,并将\w视为“拉丁单词字符”,因此在这里更加棘手:https://dev59.com/OHVC5IYBdhLWcg3w51lv#22075070 - bzlm
除了中文和日文字符,\p{Lo} 可能捕获哪些其他语言的字符? - Yoav Feuerstein
2
@bzlm 关于在 .NET 中的 \w,这里有更多信息:https://dev59.com/53A75IYBdhLWcg3w_eb1#2998550(请注意,如果使用 ECMAScript 兼容行为,则 \w 并不适用于所有语言) - derekantrican
字符串:IŠMIN-AS-AK-AŠ/20 模式: "/IŠMIN-AS-AK-\p{L}{2,}/" 结果: ^ b"IÅ MIN-AS-AK-AÅ"如何解决这个问题? - keizah7

3

感谢@Andie2302指出正确的做法。

此外,对于世界上许多语言来说,它们仍然有“附加字符”,需要主要字符来生成它(例如泰语单词“เก็บ”,如果仅使用\p{L},它将只显示“เกบ”,您可以看到一些符号将从单词中消失)。

这就是为什么仅使用\p{L}不适用于所有外语的原因。

因此,您需要使用下面的代码来支持几乎所有外语。

\p{L}\p{M}

注意:

L代表“字母”(所有语言的字母,但不包括“标记”)

M代表“标记”(标记不能单独显示,需要“字母”才能显示)

此外,如果需要数字,请使用以下代码

\p{N}

注意:

N 代表“数字”。


感谢这个网站提供的非常有用的信息:

https://www.regular-expressions.info/unicode.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接