在正则表达式中,我只需要在中间允许空格,并在开头和结尾防止空格

Posted

技术标签:

【中文标题】在正则表达式中,我只需要在中间允许空格,并在开头和结尾防止空格【英文标题】:In a RegEx I need to allow spaces only in middle and prevent spaces at beginning and end 【发布时间】:2017-10-23 00:15:13 【问题描述】:

我有一个要求,其中我有以下要求来验证名称字段:

    不允许使用以下符号:&(¥)*/+¿?¡_^~¨¬;:@!"#&\|-' 不能包含数字 不能在开头或结尾包含空格

我用过下面的正则表达式:

^[^\\s0-9&(¥)*/+\\\\¿?¡_^~¨¬;:@!#&\"|-]*$

除了限制字符串之间的空格外,它满足所有条件。例如:

限制格式:"firstname lastname"

我需要允许上述格式。我只需要限制开头和结尾的空格。

【问题讨论】:

您是否允许,比如说 □◊≠∞‡?你接受什么符号?说名字必须以字母开头,可以包含字母、数字和空格,必须以数字或字母结尾? 如果您使用 javascript 作为正则表达式,为什么不在测试前简单地使用 trim() 函数呢?然后,您可以从排除项中删除空间 First name 中连续 2 个空格可以吗? 我的猜测是,您不应该真正限制开头或结尾的空格。您应该简单地按空格修剪字符串,以便修剪任何以空格开头或结尾的输入。 试试regex101.com/r/pinMdq/1。 【参考方案1】:

我假设它用于某种正则表达式属性验证,而您只想为此使用一个模式。

你已经有了第一个构建块:

[^\s0-9&(¥)*/+\\¿?¡_^`~¨¬;:@!#&\"|-]

这匹配除集合中定义的字符之外的任何字符。它与空格不匹配。如果你用* 量化并用锚换行,字符串中的任何地方都不允许有空格。因此,您只需要添加一个可选组(用*?x,y 量化,具体取决于您要允许多少个空格):

^[^\s0-9&(¥)*/+\\¿?¡_^`~¨¬;:@!#&\"|-]+(?:\s[^\s0-9&(¥)*/+\\¿?¡_^`~¨¬;:@!#&\"|-]+)*$
                                        ^^^                                         ^^

如果您还想匹配空字符串,请使用可选的非捕获组包装模式:

^(?:[^\s0-9&(¥)*/+\\¿?¡_^`~¨¬;:@!#&\"|-]+(?:\s[^\s0-9&(¥)*/+\\¿?¡_^`~¨¬;:@!#&\"|-]+)*)?$
 ^^^                                                                                     ^^

根据需要转义反斜杠。

至于名称中的连字符:允许它与空格位于同一位置可能是合适的:

^(?:[^\s0-9&(¥)*/+\\¿?¡_^`~¨¬;:@!#&\"|-]+(?:[\s-][^\s0-9&(¥)*/+\\¿?¡_^`~¨¬;:@!#&\"|-]+)*)?$
                                              ^^^^^

【讨论】:

以上是关于在正则表达式中,我只需要在中间允许空格,并在开头和结尾防止空格的主要内容,如果未能解决你的问题,请参考以下文章

将字母和数字匹配在一起或仅匹配字母的正则表达式

仅名字的正则表达式英语

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

JS问题,去掉字符串的前后空格