2015-09-09 164 views
0

我編程在Java中刪除的文字,我有一個類似於此弦數:Java的正則表達式之間幷包括括號從字符串

"Avg. Price ($/lb)" 
"Average Price ($/kg)" 

我想刪除從兩個字符串($/lb)($/kg)和會留下

"Avg. Price" 
"Average Price". 

我的代碼檢查是否一個字符串海峽變量匹配上面的字符串之一,如果確實如此,替換文本中包括一個空字符串括號:

if(str.matches(".*\\(.+?\\)")){ 

      str = str.replaceFirst("\\(.+?\\)", ""); 
    } 

當我將str.matches更改爲str.contains(「$/lb」);作爲一個測試,想要的子字符串被刪除,這導致我相信if語句有問題。任何幫助,我做錯了什麼?謝謝。

更新 我改變了if語句:

if(str.contains("(") && str.contains (")")) 

也許不是一個完美的解決方案,但它似乎工作。

+0

你正確顯示對我的作品的片斷。所以這個問題在你程序中的其他地方。也許你可以發佈你的整個程序而不是兩行? –

+0

程序也適合我。我運行了以下代碼片斷:'String str =「Hi($/lb)」; System.out.println(「\」「+ str +」\「」);如果(str.matches(「。* \\(。+?\\)」)){str = str.replaceFirst(「\\(。+?\\)」,「」); } System.out.println(「\」「+ str +」\「」);'並且得到了預期的'「Hi($/lb)」「Hi」'。 – Luke

+0

您可以使用'java.util.regex.Matcher'中的'find()'方法來查找非詳盡的匹配,但您確實不需要。 'replaceFirst()'和'replaceAll()'處理所有搜索以及替換。如果他們沒有找到任何匹配,他們將不變地返回原始字符串。 –

回答

1

str.matches對我來說一直是個問題。我認爲這意味着你通過它的正則表達式包含'^'和'$'。

既然你只關心更換有問題的字符串的任何事件 - 請嘗試以下操作:

str = str.replaceAll("\\s+\\(\\$\\/(lb|kg)\\)", ""); 

有一個online regex testing tool,你也可以嘗試一下,看看你的表情是如何工作的。

編輯關於你的評論,表達可以改變,只是:

str = str.replaceAll("\\s+\\([^)]+\\)$", ""); 

這意味着,找到以一個或多個空格字符的任意內容部分,其次是字面'(',然後查找任何非')'字符序列,然後在行尾加上一個字符')'。

這是否符合您的期望?

此外,請注意關於'matches()'和'find()'的評論,這非常影響您的操作。

+0

我很感激幫助。上面的兩個字符串只是一個例子。除「平均價格($ /磅)」和「平均價格($/kg)」以外,我有不同的字符串。太多列出,所以我不認爲你的解決方案將工作。 – pseudorandom

+0

更準確地說,它的行爲就像你的正則表達式真的是''\\ A(?: + yourRegex +「)\\ z」'。對於非窮舉匹配,您必須使用java.util.regex.Matcher.find( )'。 –

0

此代碼工作正常。

String str = "Avg. Price ($/lb) Average Price ($/kg)"; 

    if (str.matches(".*\\(.+?\\)")) { 
     str = str.replaceFirst("\\(.+?\\)", ""); 
    } 
    System.out.println("str: "+str); 

This will print Avg。價格平均價格這就是你需要的。

注:我更改了replaceFirstreplaceAll here。

0

與其他大多數流行的應用語言,Java中的matches()方法,如果正則表達式的整個字符串(字符串的不部分在Perl,紅寶石,PHP,JavaScript的等),只匹配返回true

正則表達式匹配括號內輸入,包括任何前導空格,就是:

" *\\(.*?\\)" 

,並用它來去除匹配代碼:

str = str.replaceAll(" *\\(.+?\\)", ""); 

下面是一些測試代碼:

String str = "foo (stuff) bar(whatever)"; 
str = str.replaceAll(" *\\(.+?\\)", ""); 
System.out.println(str); 

輸出:

"foo bar" 
0

String first =「^(\\ w + \\。\\ s \\ w +)」;

這將打印出平均。價格

String second =「(\\ w \\ s \\ w)」;

這將打印出平均價格

希望這個簡單的答案有助於

相關問題