2014-06-20 72 views
0

我是一個Java初學者,給予相同的標點符號

"Se excluye arbitraje de ley y [rotura de lunas]Gar_1. 
Se excluye arbitraje de ley y [rotura de lunas]noGar" 

我想找出

"[rotura de lunas]Gar_1" and "[rotura de lunas]noGar". 

那麼一句,我寫了下面的正則表達式:

"(.\*)Gar_1 (.\*) \\1noGar". 

只要在連接到"Gar_1"的字符串和字符串atta之間沒有標點符號請致電"noGar"。但是,只要我有一段時間(.),就像我在開始時寫的句子那樣,就找不到匹配。我試過在我的正則表達式中加入"(\\pP)*"之類的東西,試圖在我想要識別的兩個字符串之間加入標點符號的可能性,但這也不起作用。

有人可以幫我嗎?

回答

2

這應該爲你工作:

\[.+?\]\w+

將非貪婪[]之間匹配的一切,\w表示任何字符,這樣就你想要的字符串的最後部分匹配捕捉。

0

此正則表達式捕捉你想要的串1和3組:

(?s)((\[[^\]]*\])Gar_1).*?\2noGar 

demo,看1和3組在右窗格中。

要檢查他們:

Pattern regex = Pattern.compile("(?s)((\\[[^\\]]*\\])Gar_1).*?\\2noGar", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    // do something with Gar_1: regexMatcher.group(1) 
      System.out.println(regexMatcher.group(1)); 
    // do something with nogar: regexMatcher.group(3) 
      System.out.println(regexMatcher.group(3)); 
    } 
} 
  • (?s)使DOTALL模式,使點跨線匹配
  • ((\[[^\]]*\])Gar_1)捕捉[rotura de lunas]Gar_1組1裏面它,
  • (\[[^\]]*\])比賽[rotura de lunas]並將其捕獲到組2
  • .*?懶洋洋地吃起來的字符,直到我們可以匹配...
  • \2noGar,這是第2組隨後noGar,即[rotura de lunas]noGar

簡單的更換

您可以添加捕獲括號周圍組有興趣幫助你建立替換字符串。例如,這取代了Gar1通過noGar

String subject = "[rotura de lunas]Gar_1 blah [rotura de lunas]noGar"; 
String replaced = subject.replaceAll("(?s)((\\[[^\\]]*\\])Gar_1)(.*?)(\\2noGar)", "$2noGar$3$4"); 
System.out.println(replaced); 

看到輸出在online demo的底部。

+1

FYI補充說明 – zx81

+0

謝謝!你的代碼和解釋非常清楚,並且幾乎完美。唯一的問題是它用'noGar'取代了所有的'Gar_1',而我想只替換那些與前面的詞組相同的'Gar_1'作爲相應的'noGar'。也就是說,如果我有''Gar_1'blabla [rotura de lunas] noGar blabla [arbitraje medico] Gar_1',我只想用'noGar'替換與'[rotura de lunas]'對應的'Gar_1'。爲了做到這一點,我不能用你上面寫的。有什麼建議麼? – user3729787

+0

'我想只用'noGar'替換''['rotura de lunas]'的'Gar_1',這很清楚,這正是我的正則表達式所做的,我想呢? :)這組詞被捕獲爲第2組,在'noGar'之前我們再次匹配該組2。或者我錯過了什麼? – zx81

0

問題來自與.*不匹配的換行符。要更改.的默認行爲,您必須使用您可以使用(?s)設置的單行模式。例如:

(?s)(\\[[^]]*\\])Gar_1\\b(.*?)\\1noGar\\b 
0

我不知道我是否真正理解這個問題,你應該給更多的相關信息,但如果你想找出是什麼之前noGar和Gar_1可以使用的預計。

\[.*\](?=(Gar_1|noGar)) 

它應該給你2場比賽。

[rotura de lunas]