[英]Regex numbers from string
我正在嘗試編寫一個只能從給定字符串中找到數字的正則表達式。 我的意思是:
輸入: My number is +12 345 678. I have galaxy s3, its symbol 34abc.
輸出: 345
和678
(而不是+12
, 3
從字s3
或34
從34abc
)
我嘗試了數字( \\d+
)和我與白色和單詞字符的組合。 最接近的是^\\d$
但這不起作用,因為我的數字是較大字符串的一部分,而不是整個字符串本身。 你能給我一個提示嗎?
-------編輯
看起來我只是不知道如何檢查一個角色而不實際得到它。 就像“跟隨空間角色的數字(沒有這個空間)”。
一般情況下,您可以使用lookbehind和lookahead :
(?<=^|\s)\d+(?=$|\s)
使其成為捕獲輸出的部分是\\d+
。 Lookbehind和lookahead不包含在比賽中。
我只是在正則表達式中包含空格作為分隔符,但您可以將\\s
替換為您的要求所定義的任何字符類。 例如,要允許點作為分隔符(在數字前面和后面),請使用以下正則表達式:
(?<=^|[\s.])\d+(?=$|[\s.])
(?<=^|\\s)
應該如下所示:
(?<= ... )
定義了lookbehind組。 \\d+
之前的表達式是^|\\s
,意思是“行的開頭( ^
)或空格”。 類似地, (?=$|\\s)
定義了前瞻組(它必須遵循捕獲的數字),它是行的末尾( $
)或空格。
其他答案中提到的關於\\b
的注釋:它是一個很好的功能,意思是“單詞邊界”,但“單詞字符”不可自定義。 這意味着,例如,“+”字符被視為分隔符,如果使用\\b
則無法更改此字符。 通過環視,您可以根據需要自定義分隔符。
試試這個:
(?<=\s|^)\d+(?=\s|\b)
這個怎么運作:
(?<=\s|^) # Start of String OR Whitespace (will not select +)
# Positive Lookbehind ensures the data is not included in the match
\d+ # Digit(s)
(?=\s|\b) # Whitespace OR Word Boundary
# Positive Lookahead ensures the data is not included in the match
Lookarounds不會占用匹配中的任何字符,因此可以使用它們,因此Capture Groups不需要。 例如:
# Regex /.*barbaz/
barbaz # Matched Data Result: barbaz
foobarbaz # Matched Data Result: foobarbaz
# Regex (with Positive Lookahead) /.*bar(?=baz)/
barbaz # Matched Data Result: bar
foobarbaz # Matched Data Result: foobar
正如您在第二個RegEx中看到的那樣, baz
從不包含在匹配的數據結果中,但是在字符串中需要RegEx才能匹配。 上述RegEx的工作原理相同
你可以嘗試這個RegEx:
\b\d+\b
\\b
是一個單詞邊界。 但是,這將從+12
選擇12
。
您可以將RegEx更改為此選項以阻止12
被選中:
(?<!\+)\b\d+\b
這使用負面后觀 ,如果數字前面有+
,則會失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.