0

我有一个正则表达式 (Javascript),它可以采用空格,后跟可选符号 [-+],后跟数字字符 [0-9.,],后跟更多可选空格。我想要做的是确保下一个字符不是 +、-、*、/ 或 ^。下一个字符可以是任何其他文本,一旦输入其他文本,就可以包含任何数学符号。这是我到目前为止所拥有的:

^\s*[-+]?[0-9,.]+\s*[^-+*/^].*$

不过,这允许 "23 +" 和 "23 df+" 匹配,我只希望后一个示例匹配。.*如果我在接近尾声的时候离开,那么“23 +”和“23 df+”都会失败。我认为[^-+*/^]数学字符的括号表达式会匹配下一个字符,然后.*会匹配之后的字符,但事实并非如此。

谁能帮助解释如何解决它以及我哪里出错了?我是正则表达式的新手,想从我的错误中吸取教训。

更新其他示例。

"23" should match

"-23" should match

"23.5" should match

"2,345.5" should match

"23+" should not match (same for -,asterisk,/,^)

"23 +" should not match (same for -,asterisk,/,^)

"23 text" should match

"23 text+" should match (same for -,asterisk,/,^ in place of +)

"23 text +" should match (same for -,asterisk,/,^ in place of +)
4

5 回答 5

2

正则表达式是贪婪的。因此,它总是尽可能地尝试匹配。

因此,对于字符串“23 +”,您的正则表达式将执行以下操作:

  • [0-9,.]+匹配 23
  • \s*不匹配由于*
  • [^-+*/^]将匹配您的空格。
  • .*将匹配“+”。

(更新:见这里:http ://regex101.com/r/gY5pS1 )

使用您的模式,您需要通过排除空格和数字来最小化最后一组。

^\s*[-+]?[0-9,.]+\s*[^-\s0-9+*/^].*$

仅添加空格将导致您的正则表达式再次出现错误匹配,开始使用该组捕获“3”:

  • [0-9,.]+将匹配 2
  • \s*不会匹配任何东西
  • [^-\s+*/^]将匹配 3
  • .*会匹配其余的。

(更新:见这里:http ://regex101.com/r/yA3tA6 )

显然是错误的,因此也将最后一组中的 0-9 排除在外。我希望这涵盖了您的两个问题。

于 2013-09-10T19:52:58.257 回答
1

试试这个(根据OP的评论稍作修改):

^\s*[-+]?[0-9,.]+\s*(\s*[^-+*/^\s0-9]+\s*[-+]*)*$

100% 适用于您的测试用例(截至您问题的第三版)。


仅供参考,我在这里包含了0-9 : [^-+*/^\s0-9]+,因此贪婪不会影响文本的第二个“部分”。

于 2013-09-10T19:52:32.027 回答
0

使用前瞻,也许像/[-+]?[0-9,.]+\s*(?![+\-*/\^\s0-9,.])/.

请注意,您要匹配的内容也在该前瞻中,否则它只会在字符串中间中断,例如“23+”将匹配“2”,因为“3”不是那些不允许的字符之一.

于 2013-09-10T19:51:14.783 回答
0

此正则表达式仅匹配您希望它匹配的示例中的那些:

[-+]?[0-9,.]+(\s+[a-z]+\s*[-+*\/^]?)?

这是一个插图,向您展示它是如何工作的:

正则表达式可视化

'23' // true
'-23' // true
'23.5' // true
'2,345.5' // true
'23+' // false
'23 +' // false
'23 text' // true
'23 text+' // true
'23 text +' // true

不要忘记添加/i标志以关闭区分大小写。

于 2013-09-10T20:51:16.727 回答
0

使用负前瞻,您可以使用此正则表达式:

/^\s*[-+]?[\d,.]+\b(?!\s*[-+*\/^]).*$/
于 2013-09-10T20:53:23.083 回答