2012-12-29 64 views
0

我嘗試創建一個正則表達式來捕獲兩個捕獲組之間的令牌。使用正則表達式從字符串中刪除可選的編號

示例輸入

Added experiencevalidator [Java] [Spring] 
1. Added validators [Java] [Spring] 
2. Fixed issues with deletes [JPA] [Java] 

基本上我想捕捉的編號(1,2)和標籤之間的令牌([爪哇] [春季])。

預計捕獲

的匹配應返回每個相應行:

Added experiencevalidator 
Added validators 
Fixed issues with deletes 

我目前使用此代碼,它利用積極的向前看符號和lookbehinds。

private Pattern TITLE_REGEX = Pattern.compile("(?<=\\d\\.\\s)(.*?)(?=\\[.*)"); 

private String cleanseTitle(String title){ 
    Matcher m = TITLE_REGEX.matcher(title); 
    if(m.find()){ 
     System.out.println("Match found"); 
     System.out.println(m.group(1));; 
    }else{ 
     System.out.println("No Match"); 
    } 
    return title; 
} 

每一行被傳遞給經由標題參數的cleanseTitle方法。我的問題是,我不知道如何處理編號前面沒有的行。該代碼當前處理正確編號前面的行,但不在編號前面的行返回不匹配。

任何人都可以提供一個正則表達式,它將處理以編號或行之前沒有編號的行嗎?我對任何正則表達式解決方案都很開放,我不愛上我目前的正則表達式,所以請隨時更改它。任何可以幫助我更多地瞭解正則表達式的附加說明也是值得讚賞的。

回答

1

由於您使用捕獲組,你不需要lookarounds。我會的回顧後更改爲交替,要匹配的編號或領導可選空白:

^(?:\d+\.\s|\s*)(.*?)(?=\[.*) 

看到它here on Regexr

在交替的順序這裏重要的。您需要將編號作爲第一個替代項,因爲第二個替代項將始終匹配。

您也可以跳過先行和懶惰量詞與此

^(?:\d+\.\s|\s*)([^\[]+) 

看到它here on Regexr

+0

這就是我想要的。 @ fge的解決方案需要通過2個正則表達式來運行字符串。 – Falmarri

+0

@Falmarri也許,但它可能更快。例如,我根本不需要使用捕獲組,我也不需要使用懶惰的量詞;)而且我也不需要使用lookarounds。最後,如果沒有任何匹配,我不需要做任何事情,而且匹配是「快速失敗」。 – fge

+0

@stema這個解決方案的工作原理是,我打算在兩個測試中進行基準測試,我會發布結果並接受最快的測試。 –

1

您可以使用兩個正則表達式:

  1. 替代由什麼^\d+\.\s+
  2. 由什麼代替(\s+\[[^]]+\])*\s*$

當然,不要忘了在Java字符串中加倍所有反斜槓。

請注意,您不需要測試匹配:如果正則表達式不匹配,則不會進行替換。

示例代碼:

private static final String 
    BEGINNING_NUMBERS = "^\\d+\\.\\s+", 
    ENDING_TOKENS = "(\\s+\\[[^]]+\\])*\\s*$"; 

private String cleanseTitle(String title) 
{ 
    return title.replaceFirst(BEGINNING_NUMBERS, "") 
     .replaceFirst(ENDING_TOKENS, ""); 
} 
+0

我不理解你的解決方案你是什麼意思,「用什麼代替」 –

+0

見示例代碼:用空字符串替換任何匹配。如果沒有匹配,則什麼都不會被替換,所以它基本上是沒有操作的。 – fge

+0

優秀的,解決方案正在工作。打算在一兩分鐘之內看看是否有其他人在接受之前做出迴應。謝謝 –

1

由於只有固定的正則表達式,而不是寫一個新的,你匹配一個號碼在beggining。爲什麼不把它變成可選的。

(?<=\\d\\.\\s)?(.*?)(?=\\[.*) 
+0

我是否也應該使句號和空白爲可選? –

+0

我編輯它。我試圖不從頭重新編寫你的正則表達式 – Falmarri

+0

如果有更好的方法,盡一切辦法,你當前的解決方案雖然工作。我都是爲了學習。 –

相關問題