Javascript 正则表达式在一个位置的字符上失败,但在以后使用字符时匹配

Javascript 正则表达式在一个位置的字符上失败,但在以后使用字符时匹配,javascript,regex,Javascript,Regex,我有一个正则表达式(Javascript),它可以接受空格,后跟可选符号[-+],后跟数字字符[0-9],后跟更多可选空格。我要做的是确保下一个字符不是+、-、*、/或^。下一个字符可以是任何其他文本,输入其他文本后,可以包含任何数学符号。以下是我目前掌握的情况: ^\s*[-+]?[0-9,.]+\s*[^-+*/^].*$ 不过,这允许“23+”和“23 df+”匹配,我只希望后一个示例匹配。如果我在结尾处关闭*,则“23+”和“23 df+”都会失败。我认为数学字符的括号表达式[^-+*

我有一个正则表达式(Javascript),它可以接受空格,后跟可选符号[-+],后跟数字字符[0-9],后跟更多可选空格。我要做的是确保下一个字符不是+、-、*、/或^。下一个字符可以是任何其他文本,输入其他文本后,可以包含任何数学符号。以下是我目前掌握的情况:

^\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+”,您的正则表达式将执行以下操作:

  • [0-9,.]+
    与23匹配
  • \s*
    不匹配(由于
    *
  • [^-+*/^]
    将匹配您的空白
  • *
    将与“+”匹配
(更新:请参见此处:)

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

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

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

  • [0-9,.]+
    将与2匹配
  • \s*
    将不匹配任何内容
  • [^-\s+*/^]
    将匹配3
  • *
    将与其余部分匹配
(更新:请参见此处:)


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

正则表达式是贪婪的。因此,只要有可能,它总是试图匹配

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

  • [0-9,.]+
    与23匹配
  • \s*
    不匹配(由于
    *
  • [^-+*/^]
    将匹配您的空白
  • *
    将与“+”匹配
(更新:请参见此处:)

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

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

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

  • [0-9,.]+
    将与2匹配
  • \s*
    将不匹配任何内容
  • [^-\s+*/^]
    将匹配3
  • *
    将与其余部分匹配
(更新:请参见此处:)


显然是错误的,所以从最后一组中也排除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