2012-07-05 122 views
0

此代碼工作正常:更改標籤/匹配器

final String result = myString.replaceAll("<tag1>", "{").replaceAll("<tag2>", "}"); 

,但我要解析大文件,所以我問我,如果我能有一個Pattern.compile("REGEX");while

Patter p = Pattern.compile("REGEX"); 
while(scan.hasNextLine()){ 
    final String myWorkLine = scan.readLine(); 
    p.matcher(s).replaceAll("$1"); // or other value 
    ..; 
} 

我期待更快的結果,因爲正則表達式編譯一次只能處理一次。

編輯

我希望把(如果可能的話)replaceAll(..).replaceAll(..)模型圖案,並有tag1 ==>{tag2 ==>}

問題:是外循環Pattern模型的速度比內環路replaceAll.replaceAll模式?

+0

你需要什麼確切的描述?是否需要將所有的''和''分別替換爲'{'和'}'? – 2012-07-05 14:44:46

回答

1

replaceAll使用正則表達式模式。從java.lang.String中source code

public String replaceAll(String regex, String replacement) { 
    return Pattern.compile(regex).matcher(this).replaceAll(replacement); 
} 

EDIT1:請不要改變你在問什麼。選擇一個問題並堅持下去。

EDIT2:

如果你真的確定你想這樣做,這樣,編譯環外的正則表達式,在最簡單的情況下,你需要兩個不同的模式:

Pattern tag1Pattern = Pattern.compile("<tag1>"); 
Pattern tag2Pattern = Pattern.compile("<tag2>"); 
while(scan.hasNextLine()) { 
    String line = scan.readLine(); 
    String modifiedLine = tag1Pattern.matcher(line).replaceAll("{"); 
    modifiedLine = tag2Pattern.matcher(line).replaceAll("}"); 
    ... 
} 

您仍然在每行應用模式匹配器兩次,所以如果有任何性能命中,這就是原因。

不知道你的數據是什麼樣子,很難給你一個更準確的答案或更好的正則表達式。除非你在編寫本文時編輯了你的問題(再次)。

+0

我的問題是在Pattern.compile中找到好的「REGEX」來做出兩個不同的替換。 – 2012-07-05 15:03:00

2

要回答您的原始問題:是的,您可以這樣做,並且如果您在循環中多次應用相同的正則表達式,實際上它會比原始代碼更快。你的循環要寫成這樣:

Pattern p1 = Pattern.compile("REGEX1"); 
Pattern p1 = Pattern.compile("REGEX1"); 
while (scan.hasNextLine()) { 
    String myWorkLine = scan.readLine(); 
    myWorkLine = p1.matcher(myWorkLine).replaceAll("replacement1"); 
    myWorkLine = p2.matcher(myWorkLine).replaceAll("replacement2"); 
    ...; 
} 

但是,如果不your're使用正則表達式,作爲第一個例子說明("<tag1>"),那麼就不要使用String.replaceAll(String regex, String replacement),因爲它是比較慢的規律,因爲表達。而是使用String.replace(CharSequence target, CharSequence replacement),因爲它不適用於正則表達式,速度更快。

例子:

"ABAP is fun! ABAP ABAP ABAP".replace("ABAP", "Java"); 

參見:Java Docs for String.replace

這不是很好的改變你的問題是根本,但沒關係,在這裏再次感謝您的正則表達式的答案:

String s1 
     = "You can <bold>have nice weather</bold>, but <bold>not</bold> always!"; 
//EDIT: the regex was 'overengineered', and .?? should have been .*? 
//String s2 = s1.replaceAll("(.*?)<bold>(.*?)</bold>(.??)", "$1{$2}$3"); 
String s2 = s1.replaceAll("<bold>(.*?)</bold>", "{$1}"); 

System.out.println(s2); 

輸出: You can {have nice weather}, but {not} always!

這裏的循環這一新的正則表達式,是的,這將是比原來的循環要快:

//EDIT: the regex was 'overengineered' 
Pattern p = Pattern.compile("<bold>(.*?)</bold>"); 
while (scan.hasNextLine()) { 
    String myWorkLine = scan.readLine(); 
    myWorkLine = p.matcher(myWorkLine).replaceAll("{$1}"); 
    ...; 
} 

編輯:
這裏的Java RegEx syntax constructs

+0

感謝您的耐心 - 我第一次沒有找到好的作品。 Pattern中的最後一個正則表達式工作正常,而且正是我沒有搜索到的結果。 [我不知道「(。??)」] – 2012-07-05 15:30:29

+1

不客氣。 OMG,那個「'''''」是個錯誤,愚蠢的我。應該是「'。*?'」。我糾正了它。和OMG OMG我過度複雜的正則表達式!只有使用'^'和'$'(即開始/結束行)時,匹配前後的組纔是必需的。我編輯並簡化了這些示例,並添加了一個指向Java正則表達式定義的鏈接。抱歉。 – t0r0X 2012-07-05 17:08:53

+0

沒有愚蠢:犯錯誤,忘記它們是人類的東西,正確的自制是主人眼睛的簽名。有了這樣一個錯誤,我相信你明確地給了我理解'特殊結構正則表達式'的關鍵。這是我的愚蠢,無法找到最終的解決方案,這麼簡單 - ich danke Ihnen sehr。 – 2012-07-06 06:40:30