[英]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.