2009-12-16 111 views
-1

我想使用Java正則表達式替換單個<,但不是< <(所以我正在使用String.replaceAll())。現在我有Java正則表達式超匹配

([^<]|^)<([^<]|$) 

它在Python中工作,但不是Java。我也試圖否定環視,喜歡的東西

(?<!<)<(?!<) 

不過,我目前所有的嘗試匹配< <爲好。難道我做錯了什麼?有沒有我不知道的Java特有的東西?

+0

'S = s.replaceAll( 「(<<)<(<)?!?!」, 「X」);'對我來說工作正常。 – 2009-12-16 13:01:52

回答

1

如果你想用 「X」 來代替單一的 「<」 說,這樣做:

String test = "hello << world < blah < blah << blah"; 

String _test = test.replaceAll("(^|[^<])<([^<]|$)", "$1X$2"); 

System.out.println(_test); 

給你這樣的:

hello << world X blah X blah << blah 

編輯更新以匹配在開始和行末

+0

「(\ A | [^ <])<([^ <] | \ Z)」來獲得字符串開始和結尾的出現次數。 – Svante 2009-12-16 11:38:06

+0

這可以用於'a 2009-12-16 11:38:45

+0

嗨斯萬特 - 是的,我只是調整照顧的開始,行結束 – 2009-12-16 11:39:37

1

你的第一個正則表達式包含字符類([^<]|^)。這是一個積極的匹配,所以無論在角色類中被捕獲什麼,都將被替換爲replaceAll()

你的第二個正則表達式只使用環視,它僅驗證條件,並且不匹配:

(?<!<)<(?!<) 

那一個正常工作對我來說:它不匹配<<。也許你可以發佈一個代碼片段和一些不符合你期望的輸入/輸出?

+0

是啊,第一次更換真是的replaceAll( 「([^ <] | ^)<([^ <] | $)」, 「\\ 1(\\ 2」) 但第二個實際上是正常工作你用replaceAll?我有replaceAll(「(?<!<)<(?!<)」,「(」)替換<<((在所有的測試輸入中。也許我需要使用匹配器和模式? – tobiasvl 2009-12-16 11:16:35

+0

@tobiasvl:我在Java模式下使用正則表達式模擬器進行了一次測試,結果表明它工作正常。或許replaceAll和Matcher的工作方式不同嗎?不妨試試它吧 – Andomar 2009-12-16 11:27:31

+0

我已經在Java中測試過了,而不是模擬器,它按預期工作:替換'<'並單獨保留'<<',無論使用'String#replaceAll'還是'Matcher#replaceAll',結果都是一樣的 – 2009-12-16 13:19:59