2013-10-23 164 views
1

我想做一個startStr.replaceAll(searchStr,replaceStr),我有兩個要求。替換可能包含正則表達式的整個標記

  1. searchStr必須是一個整個單詞,這意味着它必須有一個空格,字符串的開頭或字符串的結尾。
    • 例如
      • startStr = 「中進行確認,把你的帽子」
      • 字符串searchstr = 「ON」
      • 項replacestr = 「」
      • 預期= 「確認,把你的帽子」
  2. searchStr可能包含一個正則表達式
    • eg
      • startStr = 「刪除此*事」
      • 字符串searchstr = 「*」
      • 項replacestr = 「」
      • 預期= 「刪除這個事情」

對於要求1,我發現這個工程:

startStr.replaceAll("\\b"+searchStr+"\\b",replaceStr)

對於需要2,我發現這工作:

startStr.replaceAll(Pattern.quote(searchStr), replaceStr)

但我不能讓他們一起工作:

startStr.replaceAll("\\b"+Pattern.quote(searchStr)+"\\b", replaceStr)

這裏是簡單測試用例失敗

startStr = "remove this * thing but not this*"

searchStr = "*"

replaceStr = ""

expected = "remove this thing but not this*"

actual = "remove this * thing but not this*"

我缺少什麼?

在此先感謝

+0

我接受下面的答案被@zdanzig。 – kane

+0

但我應該注意到我必須做一個額外的改變。 (\\ s | $)「,」「)只會替換第一個ON。 我結束了使用replaceFirst()和循環來取代所有。 – kane

回答

1

首先,在\ b或單詞邊界,也不會爲你工作的星號。原因是\ b僅檢測單詞字符的邊界。正則表達式解析器不會將*確認爲單詞字符,因此以正則表達式開頭或結尾的通配符單詞不會被有效的單詞邊界包圍。

參考頁: http://www.regular-expressions.info/wordboundaries.html http://docs.oracle.com/javase/tutorial/essential/regex/bounds.html

你可能會喜歡的一個選項是在正則表達式來提供通配符排列:

(?<=\s|^)(ON|\*N|O\*|\*)(?=\s|$) 

這裏有一個Java的例子:

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

class RegExTest 
{ 
    public static void main(String[] args){ 
    String sourcestring = "ON cONfirmation, put * your hat"; 
    sourcestring = sourcestring.replaceAll("(?<=\\s|^)(ON|\\*N|O\\*|\\*)(?=\\s|$)","").replaceAll(" "," ").trim(); 
    System.out.println("sourcestring=["+sourcestring+"]"); 
    } 
} 

你可以編寫一個小函數來自動生成通配符排列。我承認我對這些空間有點不滿,但我不認爲這是必需的。

發揮與它的在線瀏覽:http://ideone.com/7uGfIS

+0

是的,我讀了一些關於單詞的界限。我希望能有一個更簡單的答案。這可能是正確的答案。我會稍微等一下,看看其他人是否有另一種解決方案,但可能會在早上接受這是正確的答案 – kane

+0

嗯,它肯定會變得更簡單,只需'(?<= \ s | ^)(ON | \ *)(?= \ s | $)'並且沒有「排列生成」,如果你不需要部分通配符。 – sdanzig

0

試試這個,

爲了去除"ON"

 StringBuilder stringBuilder = new StringBuilder(); 
     String[] splittedValue = startStr.split(" "); 
     for (String value : splittedValue) 
     { 
      if (!value.equalsIgnoreCase("ON")) 
      { 
       stringBuilder.append(value); 
       stringBuilder.append(" "); 
      } 
     } 
     System.out.println(stringBuilder.toString().trim()); 

爲了去除"*"

String startStr1 = "remove this * thing"; 
    System.out.println(startStr1.replaceAll("\\*[\\s]", "")); 
1

"\\b"一個字邊界相一致的模式,用一個字字符在一個另一方面是ide和一個非單詞字符。 *不是一個單詞字符,所以\\b\\*\\b將無法​​正常工作。後視和前視匹配,但不消耗模式。您可以指定字符串或空白的開頭必須拿出你的圖在該空白字符或字符串的結尾必須遵循:

startStr.replaceAll("(?<=^|\\s)"+Pattern.quote(searchStr)+"(?=\\s|$)", replaceStr) 
0

可以使用(^|)\*(|$),而不是使用\\b

試試這個startStr.replaceAll("(^|)youSearchString(|$)", replaceStr);