2014-02-12 59 views
0

我需要在某些情況下剪切字符串的尾部 - 我已經使用indexOf和substring完成了這項工作,但它減慢了我的代碼((我曾考慮過正則表達式,但是這個尾部只有類似的開端 - 這不是「穩定」二字 例如,我有這樣的字符串在找到word後刪除所有文本java

aaaaa bbb cc (bb) (r-1hh) 

,我需要的結果

aaaaa bbb cc (bb) 

,但也可能有這樣的字符串

aaaaa bbb cc (bb) (r3-34fff) 

aaaaa bbb cc (bb) [tagBB- na] 

所以,問題是 - 我可以使用正則表達式來找到尾的指數?

另一個問題 - 是IndexOf或Substring在java中使用正則表達式?

+0

的indexOf比正則表達式更快。如果你想要一個完全匹配,你爲什麼要一個正則表達式? – aalku

回答

1

如何找到正則表達式匹配的位置:

Pattern p = Pattern.compile("i.*t"); 
String s = "my input string"; 
Matcher m = p.matcher(s); 
if (m.find()) { 
    System.out.println("match begins at " + m.start()); // 3 
    System.out.println("match ends at " + m.end()); // 11 
} else { 
    System.out.println("no match found"); 
} 

但是你可以刪除尾隨文字是這樣的:

String res = s.replaceFirst("^(.* input).*", "$1"); 
System.out.println("'" + res + "'"); 

或者使用完全匹配,而不逃避每個特殊字符是這樣的:

String res = s.replaceFirst("^(.* " + Pattern.quote("^something$wierd^") + ").*", "$1"); 
System.out.println("'" + res + "'"); 
+0

哇!這是我所期望的。謝謝 – curiousity

1

你可以寫它包含什麼,但))結束的正則表達式,所以你避開第一)後匹配任何東西。

+0

這不是我的情況 - 因爲有時候我在括號中有一個有效的信息。 (見(bb)的第一個例子),但無論如何你能提供一個樣本嗎? – curiousity

+0

「有時」與正則表達式不是很好的結合,你必須能夠絕對地指定它以避免任何錯誤。匹配'aaaaa bbb cc(bb)'很簡單,但是如何決定是否需要其他字符串呢? – Smutje

+0

我已經寫了一個決定alg。爲此 - 這是專門針對項目邏輯。但據我瞭解正則表達式不能給我像索引?正則表達式適用於搜索常量字符串。我是對的? – curiousity

0

您可以使用$來匹配字符串的末尾,然後找到您的尾巴的常見模式。它始終是位於[]或()之間的字母數字/短劃線/空格字符?那就是你的模式。

然後,只需在初始字符串的開頭和使用尾部模式找到的子字符串的開頭之間進行子串匹配。

0

你問:

是否可以使用正則表達式來查找字符串的索引?

您可以使用模式和匹配器來實現此目的。 剛剛注意到有人評論過這個,所以我不會舉個例子。

String方法IndexOf或Substring在Java中使用正則表達式嗎?

不,在java中的字符串使用字符解析。你可以看到Javadoc或者來源獲得更多細節。 您可以使用Java很容易達致這,這個例子可能類似於現有的實現:

public String truncate(String str, String tail) { 
    int lengthOfTail = tail.length(); 
    int indexOfTail = str.indexOf(tail); 
    return str.substring(0, indexOfTail + lengthOfTail); 
} 

(爲了清楚省略了錯誤處理)

相關問題