Javascript 正则表达式在一个位置的字符上失败,但在以后使用字符时匹配
我有一个正则表达式(Javascript),它可以接受空格,后跟可选符号[-+],后跟数字字符[0-9],后跟更多可选空格。我要做的是确保下一个字符不是+、-、*、/或^。下一个字符可以是任何其他文本,输入其他文本后,可以包含任何数学符号。以下是我目前掌握的情况:Javascript 正则表达式在一个位置的字符上失败,但在以后使用字符时匹配,javascript,regex,Javascript,Regex,我有一个正则表达式(Javascript),它可以接受空格,后跟可选符号[-+],后跟数字字符[0-9],后跟更多可选空格。我要做的是确保下一个字符不是+、-、*、/或^。下一个字符可以是任何其他文本,输入其他文本后,可以包含任何数学符号。以下是我目前掌握的情况: ^\s*[-+]?[0-9,.]+\s*[^-+*/^].*$ 不过,这允许“23+”和“23 df+”匹配,我只希望后一个示例匹配。如果我在结尾处关闭*,则“23+”和“23 df+”都会失败。我认为数学字符的括号表达式[^-+*
^\s*[-+]?[0-9,.]+\s*[^-+*/^].*$
不过,这允许“23+”和“23 df+”匹配,我只希望后一个示例匹配。如果我在结尾处关闭*
,则“23+”和“23 df+”都会失败。我认为数学字符的括号表达式[^-+*/^]
将匹配下一个字符,然后*
将匹配后面的字符,但情况似乎并非如此
有人能解释一下如何修复它以及我哪里出了问题吗?我是新加入regex的,我想从我的错误中吸取教训
使用其他示例进行更新
"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 +)
使用lookahead,可能类似于
/[-+]?[0-9,.]+\s*(?![+\-*/\^\s0-9,.])/
请注意,你要匹配的也是在前面,因为否则它会在字符串中间断开,例如“23 +”将匹配“2”,因为“3”不是那些不允许的字符。使用“前瞻”,可能类似于“代码>/[-+]”[0-9,.+] s*(?[+*/\^ s0 -9,.])/< /> > < /p>
注意,你要匹配的也在前面,因为否则它会在字符串中间断开,例如“23 +”将匹配“2”,因为“3”不是那些不允许的字符之一。
试试这个(稍加修改): 适用于您的测试用例(截至)仅供参考,我已经在这里加入了0-9:
[^-+*/^\s0-9]+
,所以贪婪不会影响文本的第二部分。试试这个(根据以下内容稍加修改):
适用于您的测试用例(截至)
仅供参考,我已经在这里包含了0-9:
[^-+*/^\s0-9]+
,所以贪婪不会影响文本的第二部分。正则表达式是贪婪的。因此,只要有可能,它总是试图匹配
因此,对于字符串“23+”,您的正则表达式将执行以下操作:
与23匹配[0-9,.]+
与不匹配(由于\s*
)*
将匹配您的空白[^-+*/^]
将与“+”匹配*
^\s*[-+]?[0-9,.]+\s*[^-\s0-9+*/^].$
仅添加空格将导致您的正则表达式再次进行错误匹配,并开始捕获该组的“3”:
将与2匹配[0-9,.]+
将不匹配任何内容\s*
将匹配3[^-\s+*/^]
将与其余部分匹配*
显然是错误的,所以从最后一组中也排除0-9。我希望这涵盖了你的两个问题。正则表达式是贪婪的。因此,只要有可能,它总是试图匹配 因此,对于字符串“23+”,您的正则表达式将执行以下操作:
与23匹配[0-9,.]+
与不匹配(由于\s*
)*
将匹配您的空白[^-+*/^]
将与“+”匹配*
^\s*[-+]?[0-9,.]+\s*[^-\s0-9+*/^].$
仅添加空格将导致您的正则表达式再次进行错误匹配,并开始捕获该组的“3”:
将与2匹配[0-9,.]+
将不匹配任何内容\s*
将匹配3[^-\s+*/^]
将与其余部分匹配*
显然是错误的,所以从最后一组中也排除0-9。我希望这涵盖了您的两个问题。此正则表达式只匹配您希望它匹配的示例中的问题:
[-+]?[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
标志以关闭区分大小写功能。此正则表达式仅与示例中您希望它匹配的正则表达式匹配:
[-+]?[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
标志以关闭区分大小写。使用负前瞻,您可以使用以下正则表达式:
/^\s*[-+]?[\d,.]+\b(?!\s*[-+*\/^]).*$/
使用负前瞻,可以使用以下正则表达式:
/^\s*[-+]?[\d,.]+\b(?!\s*[-+*\/^]).*$/
也许它在你的文本中,但你能举例说明有效和无效的匹配。是否需要
+
符号?请注意,当你使用*
量词时,它可能匹配0次,这就是这里发生的情况。@progenhard,我添加了一些额外的例子。@Broxzier否+不是必需的。我添加了更多的例子。也许它在你的文本中,但你能给出一些有效和无效匹配的例子吗?+
符号是必需的吗?请注意,当你使用*
量词时,它可能匹配0次,这就是这里发生的情况。@progenhard,我添加了一些额外的例子。@Broxzier否+不是必需的。我添加了更多的例子。这与最初的测试非常接近。“23+”这个案子是合法的,这意味着我可能把注意力放错地方了。我想基本上忽略空白。\s*
似乎会影响这一点。有什么想法吗?太好了。非常感谢你的帮助。一、 当然,我们找到了另一个测试用例(“34”),但只需稍加修改就可以解决它<代码>^\s*[-+]?[0-9,.]+\s*(\s*[^-+*/^\s0-9]+\s*[-+]*)*$@elia