我想知道是否有可能(並且如果可能,我如何實現它)使用一個正則表達式處理字符串值(Java) 。Java:根據正則表達式的值更改var的值(String)
例如:
String content = "111122223333";
String regex = "?";
預期結果:"1111 2222 3333 ##";
我想知道是否有可能(並且如果可能,我如何實現它)使用一個正則表達式處理字符串值(Java) 。Java:根據正則表達式的值更改var的值(String)
例如:
String content = "111122223333";
String regex = "?";
預期結果:"1111 2222 3333 ##";
行,因爲OP重新定義了問題(即,一組12位數字應在3組4,然後接着##
分離,溶液變成這樣:
Pattern p = Pattern.compile("(?<=\\d)(?=(?:\\d{4})+$)");
String ret = p.matcher(input).replaceAll(" ") + " ##";
正則表達式改變相當多的:
(?<=\d)
:應該有後面一個數字;(?=(?:\d{4})+$)
:應該有4位數字之後的一個或多個基團,直至行尾((?:...)
是一個非捕獲組 - 不確定它真的對Java有影響)。驗證輸入是12位數的長度可以很容易地完成與方法是非正則表達式相關的。事實上,這個驗證是必要的:不幸的是,這個正則表達式也會將12345
轉換爲1 2345
,但是由於lookbehinds無法匹配任意長度的正則表達式,所以沒有辦法解決這個問題......除了.NET語言。有了他們,你可以寫:
(?<=^(?:\d{4})+)(?=(?:\d{4})+$
隨着一個正則表達式而已,我不認爲這是可能的。但您可以:
(?<=(.))(?!\1)
;即:
Pattern p = Pattern.compile("(?<=(.))(?!\\1)");
String ret = p.matcher(input).replaceAll(" ") + " ##";
如果你的意思是爲了把所有的組,然後刪除第二個操作。
說明:(?<=...)
是一個積極向後看,而(?!...)
負面看。在這裏,您要告訴您想要找到一個位置,在該位置後面有一個字符,該位置被捕獲,並且相同字符應該跟隨而不是。如果是這樣,請用空格替換。 lookaheads和lookbehinds是主播,並且和所有主播一樣(包括^
,$
,\A
等),它們不會消耗字符,這就是它工作的原因。
相當聰明! (和很好的解釋)+1 – ridgerunner 2011-12-19 16:25:40
首先,感謝您提供的解決方案。但我提出的例子並不是最好的例子。我真正想要的是用一個新字符串中的12位數字符串進行轉換,每個字符由3組4位數字組成(dddd dddd dddd),並以##結尾,如「dddd dddd dddd ##」 – Orlandols 2011-12-19 18:34:04
@ user1106161 OK ,請參閱補充內容 – fge 2011-12-19 18:53:19
與你的第一個答案一樣,後顧是一種無理的複雜性。正如你所說,*驗證*字符串屬於一個單獨的步驟。完成之後,您可以簡單地用'「$ 1」替換所有的''\\ d {4}'''並且粘貼'##'。 – 2011-12-19 19:47:26
是的,的確如此,而且速度更快。 – fge 2011-12-19 19:57:03
謝謝,解決了我的問題:) – Orlandols 2011-12-20 10:42:48