2010-06-21 31 views
1

之前匹配什麼,我試圖通過類型的數字來標記以下片段:java.util.regex中表達

"(0-22) 222-33-44, 222-555-666, tel./.fax (111-222-333) 22-33-44 UK, TEL/faks: 000-333-444, fax: 333-444-555, tel: 555-666-888" 

"tel: 555-666-888, tel./fax (111-222-333) 22-33-44 UK" 

"fax (111-222-333) 22-33-44 UK, TEL/faks: 000-333-444, fax: 333-444-555" 

等。

這個概念是,它可以是類似「tel/faks」和「電話/傳真號碼」之後的任意組合,也可以是字符串開頭的「電話/傳真號碼」。

我有這樣的:

"(?:.(?!((tel|fax|faks)[ /:.]+)+))++" 

在例1中,卻發現()後返回的是:(字符 '_' 都是我加的)

    _(0-22)222-1 33-44,222-555-666,_
    _TEL./_
    _FAX(111-222-333)22-33-44英國,_
    _TEL_
    _FAKS:000-333-444,_
    _FAX:333-444-555_

似乎我失去了每個組中的一個字符,像「TEL/faks」這樣的組合類型被分割。我還需要抓取(如果存在,如果不存在,則默認號碼是tel)以供將來處理。

我該如何擺脫這個?

PS。我使用:不區分大小寫

+0

我想了解你輸出想要什麼樣子的,一個例子字符串有助於。 – 2010-06-21 22:39:21

+0

@Lauri Lehtinen,感興趣的thx。 我想這樣我寫的字符串( 「找到()」 - 例如),但不splited例如: 「_TEL /電傳:000-333-444,_」 而非 「_TEL_ _FAKS: 000-333-444,_「 – 2010-06-22 06:59:26

+0

是否有一個原因,你不能只做」(0-22)..其餘的字符串「.split(」,「); ? – 2010-06-22 07:13:32

回答

1

你的正則表達式表示(大約):

(?:         Match a group consisting of: 
    .         any character 
    (?!        that is not followed by 
     ((tel|fax|faks)[ /:.]+)+))  "tel" or "fax" or "fakx", followed by at least one 
               punctuation character from [ /:.] 
           + (multiple times) 

這就是爲什麼你「電話」,「傳真」等之前得到一個丟失的人物 - 因爲你的正則表達式說從來沒有匹配「電話」,「傳真」等之前的字符。

這也是爲什麼「Tel./.faks:」被拆分 - 因爲最後一個「。」。在「傳真」之前,所以它不匹配。

我建議構建匹配兩個正則表達式:

A - a telephone number (parens, digits, commas, spaces), with at least one digit 
B - a telephone/fax designation ("fax", "faks", "tel", punctuation) 

然後搜索匹配

B*A+ 
+0

thx回覆。現在很清楚。但我不知道如何用單個正則表達式來解決這個問題。 – 2010-06-22 14:37:11

+0

仔細閱讀 - 我已經給出瞭解釋如何解決它與我的答案中的一個正則表達式:)單個正則表達式是「B * A +」,但你必須弄清楚什麼是A和B(因爲它會取決於你想要的結果)。 – psmears 2010-06-22 15:02:37