2016-08-12 37 views
0

我試圖從絃樂器Personal number: 123456具有以下的正則表達式提取個人數可變長度:正則表達式:匹配通配符隨後的數字

(Personal number|Personalnummer).*(\d{2,10}) 

當試圖獲得小組第二,它只會包含個人號碼的最後2位數字。如果我將數字範圍更改爲{3,10},它將匹配個人號碼的最後3位數字。

現在我不能僅僅將空格添加爲額外的組,因爲我不能確定總是會有空格 - 可能沒有空格或其他字符,但個人號碼總是會在最後。

是否有反正我可以指示解析器得到整個數字字符串?

回答

3

.*正在爲正則表達式的貪婪量詞。它最後會吃掉所有匹配的字符,除了最後2個匹配字符串的匹配字符。

你必須通過申請?使其不願意。像下面一樣

(Personal number|Personalnummer).*?(\d{2,10}) 

現在它應該完美地工作。

您也可以將第一組轉換爲非捕獲組,然後在下面的答案中只能得到您想要的數字。

(?:Personal number|Personalnummer).*?(\d{2,10}) 
+0

也做到了:)另外感謝與非捕獲組的提示,這只是解決了另一個問題:) – Ahatius

+0

不客氣! – 11thdimension

+0

如果你知道它可以是一個可選的冒號,然後只有空白(?:P N | Pn),你可以考慮更具體一些:? *(\ d {2,10}}''這樣,它不必勉強,你確信你不會失去意想不到的東西。 (然而它不太寬容)。 – eckes

1

的通配符匹配(例如*?)使用不願意quantifier。例如.*?將導致全數字表達式:

Pattern p = Pattern.compile("(Personal number|Personalnummer).*?(\\d{2,10})");//note the ? 
Matcher m = p.matcher("Personal number: 123456"); 
if (m.find()){ 
    System.out.println(m.group(2)); 
}