正则表达式:任意字符包裹至少一个空格

3
我希望强制用户输入的字符串中至少有两个单词,用空格分隔。
允许的字符串应该至少有一个字符在左侧和右侧包含至少一个空格。开头没有空格,结尾也没有空格。
以下是一些例子:
- John Doe(有效) - John Walter Doe(有效) - John(无效) - John $ole(有效) - 3d3n 1snt f4r(有效) - John the 3rd(有效) - Jöning Wölter(有效) - Joe Garçon(有效) - Harald Spaß(有效)
顺便说一下:我想将其用于非常薄弱的全名检查。由于名称中可能出现许多特殊字符,因此我只想让我的用户强制输入至少两个单词的字符串。
3个回答

2
如果我理解你的需求,那么在正则表达式中它应该翻译成这样:
^\S+\s+.*\S$

如果您希望您的空白处只显示" ",请使用:
^\S+ +.*\S$

但是要小心,不要在这里做出文化假设。真实姓名并不遵循严格的规则。


我想至少有一个名字和姓氏是很常见的。对吧? - tmuecksch
很常见,没错。但这并不意味着它是一条规则。说实话,与我们在这种情况下通常看到的正则表达式相比,这个正则表达式要合理得多。 - Denys Séguret
这个解决方案使用 .*,这可能会对性能产生不良影响。它还将匹配任何空格,因此包括换行符、制表符等。 - Andrew
@tmuecksch 值得一读:http://salesforce.stackexchange.com/questions/41153/best-regex-for-first-last-name-validation 和 http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ - Denys Séguret
@DenysSéguret 谢谢。这确实是非常有用的知识。 - tmuecksch

1
这将匹配一个单词,后跟一个或多个空格+单词组。
/^\S+(\s+\S+)+$/

它确实匹配任何空格,因此可能会这样:

它确实匹配任何空格,因此可能会这样

/^\S+( +\S+)+$/

会更好

1
它允许在前面和后面留下空格。你能否更改你的答案以防止这种情况发生? - tmuecksch

0
尝试像这样做:

^(\S+)(\s{1}\S+)+$

为什么你在第一个单词周围加括号? - Denys Séguret
我的错,这只是为了区分两种不同的模式,但它非常无用。 - Shifty

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