正则表达式在一个地方的字符上失败但匹配如果稍后使用字符

时间:2013-09-10 19:43:27

标签: javascript regex

我有一个正则表达式(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 +)

5 个答案:

答案 0 :(得分:2)

正则表达式贪婪。因此,只要可能,它会尝试匹配ALWAYS。

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

  • [0-9,.]+与23
  • 相匹配
  • \s*匹配 NOTHING (由于*
  • [^-+*/^]将匹配您的空白。
  • .*将与“+”匹配。

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

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

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

只是添加空格会导致你的正则表达式再次采取错误的匹配,开始用该组捕获“3”:

  • [0-9,.]+将匹配2
  • \s*会匹配 NOTHING
  • [^-\s+*/^]将匹配3
  • .*会与其他人匹配。

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

显然是错误的,所以也从最后一组中排除0-9。我希望这涵盖了你的两个问题。

答案 1 :(得分:1)

试试这个(根据OP's comment进行略微修改):

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

为您的测试用例100%工作(截至third revision of your question)。


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

答案 2 :(得分:0)

使用前瞻,可能类似于/[-+]?[0-9,.]+\s*(?![+\-*/\^\s0-9,.])/

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

答案 3 :(得分:0)

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

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

以下是向您展示其运作方式的说明:

Regular expression visualization

'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标志以关闭区分大小写。

答案 4 :(得分:0)

使用否定预测,您可以使用此正则表达式:

/^\s*[-+]?[\d,.]+\b(?!\s*[-+*\/^]).*$/