2015-09-09 165 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)”;

这将打印出平均价格

希望这个简单的答案有助于

相关问题