2017-04-12 1865 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'。 –