我有一个正则表达式(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 +)
最佳答案
正则表达式是贪婪的。因此,只要有可能,它就会尝试始终匹配。
因此,对于字符串“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。我希望这能解决您的两个问题。
关于javascript - 正则表达式在一处字符失败但如果稍后使用字符则匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18727519/