2016-02-24 22 views
0

使用正則表達式的字符組我有這樣的字符串:更換用Java

<b.*?n.*? .*?a.*?n.*? .*?e.*?&nbsp;.*? .*? .*? .e.*?t.*?e.*? .*? .*? .*? .*?<.r>.*? .*?e.*? .*? .*? .*?l.*?e .*?b.*?e.*?n.*?b.*? .*? .*?a.*?p.*?t.*? .*?l.*? .*? .*? .*? .*? ..b.*? .*? .*?s.*? .*?s.*? .*?>.*? .*?es.*? .*?n.*?t.*?r.*? .*? .*? .*? .n.*?b.*? .*? .*? .*? .*? .*?e.*? .*? .*? .*? .*?t.*?n.*? .*? .*? .*? .*?n.s.. .*?a. .*? <.*?e.e.*? comp.*? .*?<.*? .*?r.*?el.*?&.*?b.*? .*? .*?y.*? ..e.*? .. .*? .*? .*? .*? .*?u.t.*?m..o.*?b.*?r.*?e.*?n.*?o.. .*? .*?s. .*?e.*?o.. .*?r.*?r.*?&.*?b.*? ..b>.*?o.*?s.*? .*?r.*? .*? .*?a..i.*? .*? .*? .*?e.*?in.*? .*? .*? .*? .*? .*? .*? ..b.*? .*? .*? .*?r..i.*?c.*? .*? .*?o.*?<..>.*? 

抱歉但*從上面的文字刪除。

我希望能夠將連續出現的.*?替換爲單個.*?。我試過

res = tmp.replaceAll("(\\s\\.\\*\\?)(\\1{2,})","\\s\\.\\*\\?"); 

但它沒有工作。我的代碼有問題嗎?

+0

不' 「(\\小號\\ * \\?){2}」'工作作爲您的搜索模式?另外,我想你不希望更換中的逃跑。 –

+0

我猜' '只是一個空格,只是格式化問題後我編輯。 –

回答

0

您可以使用

(\s*)(?:\s*\.\*\?){2,} 

並替換爲$1.*?。第1組反向引用$1將在第一個.*?之前保留最初的空白。

正則表達式匹配:

  • (\s*) - 第1組:零個或多個空格符號
  • (?:\s*\.\*\?){2,} - 兩個或更多序列:
    • \s* - 零個或多個空格符號
    • \. - 文字點
    • \* - 文字上的星號
    • \? - 字面?符號

regex demo

示例代碼:

String p = "(\\s*)(?:\\s*\\.\\*\\?){2,}"; 
String str = "<b.*?n.*? .*?a.*?n.*? .*?e.*? \\.*? .*? .*? .e.*?t.*?e.*? .*? .*? .*? .*?<.r>.*? .*?e.*? .*? .*? .*?l.*?e .*?b.*?e.*?n.*?b.*? .*? .*?a.*?p.*?t.*? .*?l.*? .*? .*? .*? .*? ..b.*? .*? .*?s.*? .*?s.*? .*?>.*? .*?es.*? .*?n.*?t.*?r.*? .*? .*? .*? .n.*?b.*? .*? .*? .*? .*? .*?e.*? .*? .*? .*? .*?t.*?n.*? .*? .*? .*? .*?n.s.. .*?a. .*? <.*?e.e.*? comp.*? .*?<.*? .*?r.*?el.*?&.*?b.*? .*? .*?y.*? ..e.*? .. .*? .*? .*? .*? .*?u.t.*?m..o.*?b.*?r.*?e.*?n.*?o.. .*? .*?s. .*?e.*?o.. .*?r.*?r.*?&.*?b.*? ..b>.*?o.*?s.*? .*?r.*? .*? .*?a..i.*? .*? .*? .*?e.*?in.*? .*? .*? .*? .*? .*? .*? ..b.*? .*? .*? .*?r..i.*?c.*? .*? .*?o.*?<..>.*?"; 
String subst = "$1.*?"; 
System.out.println(str.replaceAll(p, subst)); 

IDEONE demo

0

我建議你使用循環並將其替換。類似如下

 String pattern= "(.\*\?\s.\*\?)"; 
     if(YOURSTRING.matches(pattern)){ 
      // replace two .*? to one 
     } 
     else{ 
      // break your loop 
      } 

這不是一個完整的解決方案。但一些基本的想法

0

你可以試試這個:

str.replaceAll("\\p{Blank}+", "").replaceAll("[\\.\\*\\?]+", ".*?"); 

例子:

String str = "abcabcddabceeabcabc"; 
str = str.replaceAll("[abc]+", "abc"); 
System.out.println("str = " + str); 

而結果:

str = abcddabceeabc