0

我想匹配以下规则:

  • 数字开头允许有一个破折号。
  • 只应允许 0 到 9 之间的值。

我目前有以下正则表达式模式,我正在匹配相反的模式,以便在找到不符合规则的匹配项时抛出异常:

[^-0-9]

这种模式的缺点是它适用于所有情况,除了字符串中间的连字符仍然会通过。例如:

“-2304923”是正确允许的,但“9234-342”也是允许的,不应该是。

请告诉我如何将第一个字符指定为 [^-0-9] 并将其余字符指定为 [^0-9]。谢谢!

4

4 回答 4

2

你可以这样做:

(?:^|\s)(-?\d+)(?:["'\s]|$)

 ^^^^^                        non capturing group for start of line or space
         ^^^^^                capture number
                 ^^^^^^^^^    non capturing group for end of line, space or quote 

看它工作

这将捕获一行中的所有数字字符串,前面有一个可选的连字符。

-2304923"  "9234-342"   1234 -1234 
++++++++                                   captured
            ^^^^^^^^                       NOT captured
                        ++++               captured
                             +++++         captured
于 2013-02-09T20:51:48.540 回答
2

此正则表达式将为您工作:

^-?\d+$

解释:开始字符串^,然后-可选(?),\d重复几次的数字(+),字符串必须在这里结束$

于 2013-02-09T20:49:19.367 回答
1

我不明白你的模式[^-0-9]是如何匹配你正在谈论的那些字符串的。这种模式与你想要的正好相反。您只是简单地通过caret(^)在开头使用来否定字符类。因此,此模式将匹配除hyphen和之外的任何内容digits

无论如何,根据您的要求,首先您需要hyphen在开始时匹配一个。所以,只要把它放在字符类之外。然后以后要匹配任意数量的数字,您可以使用[0-9]+or \d+

因此,与所需格式匹配的模式应该是:

-[0-9]+  // or -\d+

上面的正则表达式用于在一些大字符串中查找模式。如果您希望整个字符串与此模式匹配,则可以在正则表达式的末尾添加锚点:-

^-[0-9]+$
于 2013-02-09T20:46:38.537 回答
0

对于像这样的正则表达式,有时从两种情况下考虑它会有所帮助。

  • 第一个字符是否以某种方式搞砸了?
  • 如果不是,其他角色是否以某种方式搞砸了?
  • 将这些与|

 (^[^-0-9]|^.+?[^0-9])

在此处输入图像描述

于 2013-02-09T21:34:11.493 回答