2015-08-23 103 views
2

我試圖帶一個電話號碼,其格式爲+44或+4,後跟任意數字的數字或連字符,並替換+44或+ 4 +44或+4後跟一個空格。匹配正則表達式,但只替換第一部分 - Java

相信不用環顧四周,以配合全數字,但只能更換最初的前綴,我想要個大氣壓是

^[+]\d[0-9](?:([0-9]+))? 

其數量(不帶連字符)相匹配,但是我想先行只會匹配數字,並不捕獲額外的數字,但它似乎捕捉整個事情。

任何人都可以指出我正確的方向,我做錯了什麼?

編輯: 爲了更清楚我的Java代碼

Pattern pattern = Pattern.compile("^[+]\\d[0-9](?:([0-9]+))?"); 
if(pattern.matcher("+441234567890").matches()) 
       String num = pattern.matcher(title).replaceFirst("$0 $1"); 

感謝。

+0

你沒有一個固定的前提或規則,答案會需要。這就是爲什麼它不適合你。 – sln

+0

您不需要使用'matches',如果'replaceFirst'找不到匹配項,則會返回初始字符串。你只需要1個正則表達式來替換:'String num = Pattern.compile(「^([+] \\ d \\ d?)([\\ d - ] *)$」).matcher(title).replaceFirst 「$ 1 $ 2」);'。 –

回答

2

如果你想匹配的整數,但只更換其中的一部分,你不應該用積極的前瞻,但只是gruping,像:

(^\+\d\d)([\d-]+)? 

前綴將在第1組,其餘組2中的數字,因此要在這些部分之間添加空格,只需使用諸如group1 + space + group2之類的內容即可。 在你的榜樣應該是這樣的:

Pattern pattern = Pattern.compile("(^\\+\\d\\d)([\\d-]+)?"); 
if(pattern.matcher("+441234567890").matches()) { 
    num = pattern.matcher(title).replaceFirst("$1 $2"); 
} 

但是這個表達式會隨時捕捉兩位數字的前綴,如果你想匹配+44或+4,你應該使用:

(^\+(44|4))([\d-]+)? 

所以如果你有更多可能的前綴,你也需要改變這個正則表達式。

您的正則表達式沒有按照您的預期工作,因爲(?:([0-9]+))?是一個非捕獲組,因此這部分正則表達式匹配的片段沒有被捕獲,但它仍然與整個正則表達式匹配。所以$0返回整個正則表達式,並且$1不應該返回任何東西。

+0

感謝您的回覆。然而,雖然匹配前綴它不匹配整個數字,因此在java中使用該pattern.matcher(「+ 441234567890」)。matches返回false。我需要匹配整個數字,但只捕獲+44 ..或者我應該使用一個正則表達式匹配和一個正則表達式來替換前綴? – crazyfool

+0

@crazyfool所以你想捕捉前綴和其餘的號碼? –

+0

我想匹配整個號碼,但只捕獲前綴。我已經編輯了我的第一個問題,以準確顯示我想要做的事情,如果不太清楚,我表示道歉。 – crazyfool