C#正则表达式 - 允许字符串中包含空格

8
我是一位有用的助手,可以为您进行文本翻译。
我有一个应用程序,需要对某些字段进行验证。其中一个字段是姓氏,可能由两个单词组成。在我的正则表达式中,我必须接受这些空格,所以我尝试了很多方法,但都没有找到解决方案。
这是我的正则表达式:
@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ-\s]+$"

\s 通常用于表示空格,但它不起作用,我收到了以下错误信息:

parsing "^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ-\s]+$" - Cannot include class \s in character range.

有任何想法吗?


1
其他话题,但请查看Unicode属性\p{L},这将匹配任何语言中的字母,因此您的表达式将类似于@"^[\p{L}\s][\p{L}\s-]+$",更加优美,您不必考虑每个特殊字母。 - stema
3个回答

15

-表示一个字符范围,就像你使用A-Z来描述介于A和Z之间的任何字符。你的正则表达式使用了ñ-\s,引擎试图解释为介于ñ和\s之间的任何字符--然后注意到\s在这里并没有多大意义,因为\s本身只是任何空格字符的缩写

这就是错误的来源。

如果你想包含文字-,则应始终将-放在字符类的末尾,以消除这个问题:

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ\s-]+$"

这样,引擎就知道\s-不是字符范围,而是单独的两个字符\s-

另一种方法是转义-字符:

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêç\-\s]+$"

所以现在引擎将ñ\-\s解释为不是字符范围,而是ñ-\s中的任何一个字符。个人认为尽可能避免转义,因为我认为它会使表达式变得混乱,并且不必要地增加长度。


1
转义更加灵活。假设你有一个操作的字符类:[+-]。另一个程序员可能会将其更改为[+-*/],从而破坏模式。 - Kobi
我同意,但你可以以任何方式争论。比如说你有一个模式 [+\-*],因为你不能进行除法。有一天你可以这样做,然后另一个程序员将其更改为 [+/-*],因为他认为你只是把斜杠弄错了方向。然后转义就会消失。因此,这确实不是任何一种方式的论点。我只是更注重可读性,特别是在正则表达式中,因为它们本来就足够复杂了。 - F.P

4

您需要转义最后一个-字符 - ñ-\s被解析为范围a-z

@"^[a-zA-Zàéèêçñ\s][a-zA-Zàéèêçñ\-\s]+$"

请查看Regex Storm网站:[a-\s][a\-\s]


0
[RegularExpression(@"^[a-zA-Z\s]+$", ErrorMessage = "只允许字母和空格。")]
这个可以正常工作。

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