2017-04-12 1869 views
2

我想匹配数字,但我需要遵循一些规则。
数字可能(或可能不)以符号[+ - ]开头。
如果数字以0开头,则不能跟随任何内容。
但是,如果它本身是0,它应该匹配。如何忽略使用正则表达式以0(零)开头的数字?

我想出了下面的正则表达式:

[+-]*[1-9]\d*|[+-]*[0](?!\w) 

但它不完全工作,我需要:

01 (matches 1, should match nothing) 
9,000 (matches 9 and last 0, should match 9 only) 
+0152 (matches 152, should match nothing) 
-1200 (matches -1200, working as intended) 
+0 (matches +0, working as intended) 

Live demostration

+2

@WiktorStribiżew为什么不是'[+ - ]?'?我们是否期望多重加减? –

+0

我正在学习正则表达式,我用'*'表示'0或1',现在我看到它是'0或许多'。你说得对,我应该用'?'! –

回答

2

你可以使用这个表达式:

[+-]?\b(?:0|[1-9][0-9]*)\b 

RegEx Demo

正则表达式解体:

  • [+-]? - 匹配+-任选第一
  • \b - 断言字边界
  • (?: - 启动非捕获组
    • 0 - 匹配单个0
    • | - OR
    • [1-9][0-9]* - 匹配1-9后跟任意数字0或多次
  • ) - 结束非捕获组
  • \b - 断言字边界
+1

这是完美的!我需要了解更多关于'\ b'和'\(?:'。非常感谢! –

1

请尝试以下正则表达式:

^[+-]?[1-9]\d*|[+-]*[0](?!\w)$ 
  • 你不需要*[+-]后,它会匹配许多迹象表明,使用?代替。
  • 你需要将你的正则表达式包装在^$之间,以便它匹配你案例中匹配的正则表达式和giva想要的匹配。

编辑:

您将需要使用字边界\b而不是^$,如果你正在处理的话,而不是线。

+0

感谢您的回复!'^'和'$'不适合我,因为这些数字可能在文本之间。已经解释说,我的不好。 –

+1

所以在这种情况下,你需要按照其他答案中的建议使用'\ b'。 –