我有一个正则表达式(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 +)
答案 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*[-+*\/^]?)?
以下是向您展示其运作方式的说明:
'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*[-+*\/^]).*$/