2011-12-19 44 views

回答

0

行,因爲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})+$

+0

與你的第一個答案一樣,後顧是一種無理的複雜性。正如你所說,*驗證*字符串屬於一個單獨的步驟。完成之後,您可以簡單地用'「$ 1」替換所有的''\\ d {4}'''並且粘貼'##'。 – 2011-12-19 19:47:26

+0

是的,的確如此,而且速度更快。 – fge 2011-12-19 19:57:03

+0

謝謝,解決了我的問題:) – Orlandols 2011-12-20 10:42:48

2

隨着一個正則表達式而已,我不認爲這是可能的。但您可以:

  • 首先,用空格替換(?<=(.))(?!\1);
  • 然後,使用一個字符串append來追加「##」。

即:

Pattern p = Pattern.compile("(?<=(.))(?!\\1)"); 

String ret = p.matcher(input).replaceAll(" ") + " ##"; 

如果你的意思是爲了把所有的組,然後刪除第二個操作。

說明:(?<=...)是一個積極向後看,而(?!...)負面看。在這裏,您要告訴您想要找到一個位置,在該位置後面有一個字符,該位置被捕獲,並且相同字符應該跟隨而不是。如果是這樣,請用空格替換。 lookaheads和lookbehinds是主播,並且和所有主播一樣(包括^$\A等),它們不會消耗字符,這就是它工作的原因。

+0

相當聰明! (和很好的解釋)+1 – ridgerunner 2011-12-19 16:25:40

+0

首先,感謝您提供的解決方案。但我提出的例子並不是最好的例子。我真正想要的是用一個新字符串中的12位數字符串進行轉換,每個字符由3組4位數字組成(dddd dddd dddd),並以##結尾,如「dddd dddd dddd ##」 – Orlandols 2011-12-19 18:34:04

+0

@ user1106161 OK ,請參閱補充內容 – fge 2011-12-19 18:53:19