簡體   English   中英

如何提高Java的正則表達式性能

[英]How to improve the regex performance in java

我有這段代碼將“ =”之前的整個文本轉換為大寫

Matcher m = Pattern.compile("((?:^|\n).*?=)").matcher(conteudo);
while (m.find()) {
  conteudo = conteudo.replaceFirst(m.group(1), m.group(1).toUpperCase());
}

但是,當字符串太大時,它會變得很慢,我想找到一種更快的方法。

有任何建議嗎?

編輯

我沒有解釋正確。 我有這樣的文字

field=value
field2=value2
field3=value3

我想這樣轉換每一行

FIELD=value
FIELD2=value2
FIELD3=value3

使正則表達式快速運行的最快方法是不使用正則表達式。 對於性能敏感的操作,Regex從來都不是,而且幾乎從來都不是一個好的選擇。 (進一步閱讀: 為什么正則表達式這么有爭議?

嘗試改用String類方法,或編寫所需的自定義方法。 使用在'='上分割的標記生成器,然后在.toUpperCase()使用.toUpperCase() (在\\n )。 或者,只需將其轉換為char[]或使用charAt()並手動遍歷它,就可以在換行符之后將chars切換為upper,並在'='之后將其切換為常規方式。

例如:

public static String changeCase( String s ) {
    boolean capitalize = true;
    int len = s.length();
    char[] output = new char[len];
    for( int i = 0; i < len; i++ ) {
      char input = s.charAt(i);
      if ( input == '\n' ) {
        capitalize = true;
        output[i] = input;
      } else if ( input == '=' ) {
        capitalize = false;
        output[i] = input;
      } else {
        output[i] = capitalize ? Character.toUpperCase(input) : input;
      }
    }
    return new String(output);
}

方法輸入:

field=value\n
field2=value2\n
field3=value3

方法輸出:

FIELD=value\n
FIELD2=value2\n
FIELD3=value3

在這里嘗試: http : //ideone.com/k0p67j

PS(傑米·扎溫斯基着):

有些人在遇到問題時會認為“我知道,我會使用正則表達式”。 現在他們有兩個問題。

使用多行正則表達式,我們可以簡單地單獨獲取每行並替換它:)

String conteudo = "field=value\nfield2=value2\nfield3=value3";
Pattern pattern = Pattern.compile("^([^=]+=)(.*)$", Pattern.MULTILINE);
Matcher matcher = pattern.matcher(conteudo);
StringBuffer result = new StringBuffer();

while (matcher.find()) {
    matcher.appendReplacement(result, matcher.group(1).toUpperCase() + matcher.group(2));
}
System.out.println(conteudo);
System.out.println(result.toString());

那這樣的東西呢? indexOf應該足夠快。

int equalsIdx = conteudo.indexOf('=');
String result = conteudo.substring(0, equalsIdx).toUpperCase() + conteudo.substring(equalsIdx, conteudo.length());
((?:^|\n)[^=]*=)

嘗試這個 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM