2011-10-26 188 views
3

我想在一個文件來替換一個詞時,它出現時,它被包含在一個字符串,除了:替換詞不是一個字符串

所以我應該在

The test in this line consists in ... 
更換 this

但不應該匹配:

The test "in this line" consist in ... 

這就是我想:

line.replaceAll("\\s+this\\s+", " that ") 

但它無法處理這種情況,所以我嘗試使用:

line.replaceAll("[^\"]\\s+this\\s+", " that ") 

但也不起作用。

任何幫助,將不勝感激

+0

因此,在這種情況下字符串包含沒有轉義字符? –

+0

這是對的我只是應該忽略一個字符串內的任何東西...... – OscarRyz

回答

3

這似乎是工作(在目前爲止我所瞭解,從提供的例子來支持你的要求):

(?!.*\s+this\s+.*\")\s+this\s+ 

http://rubular.com/r/jZvR4XEbRf

您可能需要調整逃避java。

這是一個好一點的實際上是:

(?!\".*\s+this\s+)(?!\s+this\s+.*\")\s+this\s+ 
+0

它的確如此!謝謝你..''!''代表什麼? – OscarRyz

+0

我認爲這被稱爲負面看看,排除符合該標準的字符串。 –

+0

Nap,第二個沒有工作,但我不明白爲什麼... – OscarRyz

2

唯一可靠的方式做到這一點是要搜索的是完整,引用序列或搜索詞。你用一個正則表達式來做這件事,並且在每次匹配之後你確定你匹配哪一個。如果是搜索字詞,則替換它;否則你不要管它。

這意味着你不能使用replaceAll()。相反,你必須使用appendReplacement()appendTail()方法,如replaceAll()本身一樣。這裏有一個例子:

String s = "Replace this example. Don't replace \"this example.\" Replace this example."; 
System.out.println(s); 

Pattern p = Pattern.compile("\"[^\"]*\"|(\\bexample\\b)"); 
Matcher m = p.matcher(s); 
StringBuffer sb = new StringBuffer(); 

while (m.find()) 
{ 
    if (m.start(1) != -1) 
    { 
    m.appendReplacement(sb, "REPLACE"); 
    } 
} 
m.appendTail(sb); 
System.out.println(sb.toString()); 

輸出:

Replace this example. Don't replace "this example." Replace this example. 
Replace this REPLACE. Don't replace "this example." Replace this REPLACE. 

See demo online

我假設每個引號是顯著,他們不能逃脫 - 換句話說,你正在使用散文,而不是源代碼。轉義引號可以處理,但它使正則表達式複雜化很多。

如果您確實必須使用replaceAll(),那麼這是一種詭計,您可以使用前瞻來斷言匹配後跟偶數個引號。但它確實很難看,而且對於大型文本,您可能會發現它性價比高昂,成本過高。

相關問題