2012-05-09 49 views
0

我想寫一個通用的方法,將搜索給定字符串的文件,並將其替換爲另一個字符串。我用java的正則表達式相同搜索任何給定的字符串使用JAVA REGEX

patternMatcher = Pattern.compile(searchString); 
while ((line = readLine()) != null) { 
    Matcher regexMatcher = patternMatcher.matcher(line); 
     if (regexMatcher.lookingAt()) { 
      line = regexMatcher.replaceAll(replaceString); 

..所以在

這種邏輯的作品,只要搜索字符串在文件中的每一行的開頭。否則模式匹配不會發生。任何人都可以請建議解決方案?

例如。我的搜索字符串是 「這」 和替換字符串爲 「那」
輸入文件包含:This is not This funny
輸出:That is not That funny

但當
輸入文件包含:007 This is not This funny
輸出:007 This is not This funny

回答

1

不應該是......嗎?

patternMatcher = Pattern.compile(searchString); 
while ((line = readLine()) != null) { 
    Matcher regexMatcher = patternMatcher.matcher(line); 
     while (regexMatcher.find()) { 
      line = regexMatcher.replaceAll(replaceString); 

考慮到該quatifier可能影響結果,perhapaps搜索字符串應該是 「(這)+」 或 「(這)+?」。

+0

非常感謝。 find方法起作用。我很傻! – user1384205

+0

@ user1384205您必須提供適合您的答案並選擇一個作爲您的最終答案。 –

0

如果你正在尋找一個常量字符串,而不是一個模式,有許多原因,爲什麼你不應該使用正則表達式:

  • 用戶可能鍵入某個在正則表達式語法中具有特殊含義的字符。
  • 與子字符串搜索相比,正則表達式較慢。
  • 您不希望允許用戶使用正則表達式的更多功能(使用正則表達式匹配)。

改爲使用String.indexOf和/或String.replace

while ((line = readLine()) != null) 
    if (line.indexOf(searchString) != -1) 
     line.replace(searchString, replaceString); 
+0

我正在使用的文件有時會運行到幾個MB,並且應用程序非常密集。我決定使用正則表達式來處理字符串操作的原因是相同的,因爲我正在讀取流而不是逐行閱讀。請糾正我,如果im worng。 – user1384205

+0

如果你想要良好的IO性能,看看'java.nio'(新的I/O)。如果您想要使用NIO讀取一行,請在NIO流上使用'BufferedReader.readLine()'。所有這些與你是否選擇使用正則表達式無關。 – alexg

0

我不熟悉Java,但按照該文檔,lookingAt着眼於字符串的開頭。無論是否有比賽,我都會跳過尋找比賽,盲目跑replaceAll;如果沒有匹配,它將取代任何東西。

如果由於某種原因,你需要尋找一個匹配試圖取代(這是一種浪費)之前,正確的功能是find。請參閱http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Matcher.html

+0

謝謝。在我看來,這是一個錯誤的用法。找到很好的作品。 – user1384205

+0

請記住,'String.replaceAll()'從搜索字符串中編譯一個正則表達式。如果你不需要這個,使用'String.replace()'。 – alexg

0

如果內存不是問題,則可以將整個文件作爲字符串讀取,並在字符串API中使用public String replaceAll(String regex, String replacement)

相關問題