2012-07-26 56 views
1

我學習Java的regex部分最近,今天我遇到了一個有關使用boundry \\G的問題,這是我的代碼:如何處理與邊界'\ G'相關的正則表達式?

String input = "abcdec"; 
    System.out.println(String.format("Before :'%s' ; after replace : '%s'", input , input.replaceAll("\\Gx?", "!"))); 

,同時其打印Before :'abcdec' ; after replace : '!abcdec',我不知道爲什麼它打印這是在它與字符串開頭的第一次匹配之後,它用一個char'!'替換了這個地方。 ,但爲什麼它不能再匹配?我認爲正則表達式'\ Gx?'可以匹配每個地方。

我需要你的幫助,每個幫助表示讚賞謝謝..

+0

我搜索了一下,找到了正確的名詞:* zero-length match * [[1](http://docs.oracle.com/javase/tutorial/essential/regex/quant.html),[ 2](http://www.regexguru.com/2008/04/watch-out-for-zero-length-matches/)] – Bergi 2012-07-26 08:33:34

+0

相關,但沒有\ G:[Java正則表達式異常?](http:// stackoverflow.com/q/8604286/1048572),[在正則表達式中的奇怪行爲](http://stackoverflow.com/q/9228509/1048572)和[在Java正則表達式中的零長度匹配](http://stackoverflow.com/q/9906471/1048572) – Bergi 2012-07-26 08:35:25

+0

@Bergi謝謝,但正如你所說,這些不包含'\\ G',但再次感謝你。 – ohyeahchenzai 2012-07-26 08:49:22

回答

0

我從here引用:If you wish one search to pick up where the last one left off you can use the "\G" pattern element. 這意味着,如果沒有搜索已執行,那麼\ G變簡單地告訴搜索從頭開始並在第一場比賽中停止。

這是另一個example。請注意,再次感嘆號被添加到字符串的乞討中,因爲第一次替換並未將起始位置從0移開。

您期望從您的程序中得到什麼?

+0

我只想測試'\\ G'的功能,我在書中<<主正則表達式>>中遇到了這個問題,我無法理解它。我不明白的是,在第一次替換,它爲什麼會停止,我認爲它應該一次又一次地取代,這應該是一個無限循環。 – ohyeahchenzai 2012-07-26 07:45:59

+0

我相信他們已經考慮過這種情況,當你的模式可以分別爲0的長度。在這種情況下,全部替換將導致無限循環,因此只有第一個Ocurance(字符串的開頭)被替換 – 2012-07-26 07:48:23

+0

這可能是!我很困惑,但我找不到它! – ohyeahchenzai 2012-07-26 08:10:31

0

編輯:好的,明白了。刪除了錯誤的假設。


會發生什麼事是:

  1. replaceAll開始在輸入的開始(指數0
  2. \G初始啓動值匹配0
  3. x找不到 - 這是確定,則有條件達成
  4. 。從00的成功第一次匹配!
  5. 更換! ...添加到輸出
  6. 下一次迭代,開始於一個字符進一步(索引1
  7. 最後一場比賽的結束是0\G,應用於位置1,與其不匹配
  8. ......跨過整個字符串,它永遠不會匹配。
  9. 返回輸出字符串:!abc...

,當我讀到從Regex Boundary Matchers Java Tuturial最後一個例子它得到了更清晰的給我。

+0

但根據「大師正則表達式」一書,它使用正則表達式'x?' ,它也會導致無限循環,但會導致'!a!b!c!d!e!c!'。 – ohyeahchenzai 2012-07-26 07:54:07

+0

這本書是否包含Java片段,或者只是正則表達式? – Bergi 2012-07-26 08:00:20

+0

這段代碼基於perl – ohyeahchenzai 2012-07-26 08:01:52