簡體   English   中英

來自字符串的正則表達式編號

[英]Regex numbers from string

我正在嘗試編寫一個只能從給定字符串中找到數字的正則表達式。 我的意思是:

輸入: My number is +12 345 678. I have galaxy s3, its symbol 34abc.

輸出: 345678 (而不是+123從字s33434abc

我嘗試了數字( \\d+ )和我與白色和單詞字符的組合。 最接近的是^\\d$但這不起作用,因為我的數字是較大字符串的一部分,而不是整個字符串本身。 你能給我一個提示嗎?

-------編輯

看起來我只是不知道如何檢查一個角色而不實際得到它。 就像“跟隨空間角色的數字(沒有這個空間)”。

一般情況下,您可以使用lookbehind和lookahead

(?<=^|\s)\d+(?=$|\s)

使其成為捕獲輸出的部分是\\d+ Lookbehind和lookahead不包含在比賽中。

我只是在正則表達式中包含空格作為分隔符,但您可以將\\s替換為您的要求所定義的任何字符類。 例如,要允許點作為分隔符(在數字前面和后面),請使用以下正則表達式:

(?<=^|[\s.])\d+(?=$|[\s.])

(?<=^|\\s)應該如下所示:

  • (?<= ... )定義了lookbehind組。
  • 必須在\\d+之前的表達式是^|\\s ,意思是“行的開頭( ^ )或空格”。

類似地, (?=$|\\s)定義了前瞻組(它必須遵循捕獲的數字),它是行的末尾( $ )或空格。


其他答案中提到的關於\\b的注釋:它是一個很好的功能,意思是“單詞邊界”,但“單詞字符”不可自定義。 這意味着,例如,“+”字符被視為分隔符,如果使用\\b則無法更改此字符。 通過環視,您可以根據需要自定義分隔符。

更安全的RegEx

試試這個:

(?<=\s|^)\d+(?=\s|\b)

更安全的RegEx演示

Regex101現場演示

這個怎么運作:

(?<=\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

你可以嘗試這個RegEx:

\b\d+\b

\\b是一個單詞邊界。 但是,這將從+12選擇12

您可以將RegEx更改為此選項以阻止12被選中:

(?<!\+)\b\d+\b

這使用負面后觀 ,如果數字前面有+ ,則會失敗。

Regex101現場演示

演示

你似乎想要的是一個數字序列( \\d+ ),前面是空格( \\s )或字符串的開頭( ^ ),后跟一個空格或標點字符( [\\s.,:;!?] )或字符串( $ )的結尾,但前面/下面的空格或標點字符不應該包含在匹配中,所以你需要正向前瞻( (?=xxx) )和lookbehind( (?<=xxx) )。

(?<=^|\s)\d+(?=[\s.,:;!?]|$)

有關演示,請參閱regex101

請記住將Java文字中的反斜杠加倍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM