2013-12-09 44 views
0

假设我有一个表达a?.foo("xyz?abc"),我想在a?.foo使用正则表达式来摆脱?但内部没有"xyz?abc"的一个过滤器内的字符,该怎么办?正则表达式:在表达式中而不是引号

注意我用Java

+0

什么不匹配的引号?可以逃脱报价吗? –

+0

一个逃脱的报价将被放在一个外部引号内,所以它不应该是一个问题。无与伦比的引号是一个错误,不应该在这里考虑。然而,它需要考虑有多个引号对的情况,例如'a?.foo(“xyz?abc”)。bar(“123?456”)' –

回答

1

您必须首先捕获双引号内的内容,例如:

String subject = "a?.foo(\"x\\\"yz?abc\").bar(\"123?456\")"; 
String regex = "(?s)(\"(?>[^\\\\\"]++|\\\\{2}|\\\\.)*\")|\\?"; 
String result = subject.replaceAll(regex, "$1"); 
+0

真棒!我想我应该切换到这一个 –

1
System.out.println("a?.foo(\"xyz?abc\")" 
     .replaceAll("(\".*?\"|\\?)", "$1§") 
     .replaceAll("\\??§", "")); 

我要么替换字符或字符串“...”用特殊字符未使用§, ,然后用一个可选的字符删除§在一起。

+0

不错的解决方案,thx很多。唯一值得关注的是性能方面。但无论如何,我现在要使用这一个 –

0
String s = "a?.foo(\"xyz?abc\")"; 
System.out.println(s.replaceAll("(a\\?\\.)", "a.")); 

但我想这不是你要求的,对吗?

+0

不,解决方案中不应该存在“a”,这只是一个例子 –

1

这是一个使用MatcherappendReplacement功能的解决方案。

基本上,我们搜索"(notQuestionMark)?(notQuote)",取而代之的是"(notQuestionMark)(notQuote)"

public static void main(String[] args) throws Exception { 
    final String[] ss = {"a?.foo(\"xyz?abc\")", "a?.foo(\"xyz?abc\").bar(\"123?456\")"}; 
    final Pattern patt = Pattern.compile("(\"[^?]*+)\\?([^\"]*+\")"); 
    for(final String in : ss) { 
     final Matcher m = patt.matcher(in); 
     final StringBuffer sb = new StringBuffer(); 
     while(m.find()) { 
      m.appendReplacement(sb, "$1$2"); 
     }    
     m.appendTail(sb); 
     System.out.println(sb.toString()); 
    } 
} 

输出:

a?.foo("xyzabc") 
a?.foo("xyzabc").bar("123456") 

这可能比使用两个replaceAll呼叫的方法快,你可以使用Matcher.reset(String s)重用Matcher而实际的搜索和替换只能进行一次。

重用Matcher看起来是这样的:

public static void main(String[] args) throws Exception { 
    final String[] ss = {"a?.foo(\"xyz?abc\")", "a?.foo(\"xyz?abc\").bar(\"123?456\")"}; 
    final Matcher m = Pattern.compile("(\"[^?]*+)\\?([^\"]*+\")").matcher(""); 
    for(final String in : ss) { 
     m.reset(in); 
     final StringBuffer sb = new StringBuffer(); 
     while(m.find()) { 
      m.appendReplacement(sb, "$1$2"); 
     }    
     m.appendTail(sb); 
     System.out.println(sb.toString()); 
    } 
} 
+0

听起来不错,但我仍然喜欢卡西米尔的答案,因为它的风格简单。不过,无论如何,我会给你一个补偿。谢谢鲍里斯! –

+0

@green你说得对,那个解决方案很整洁 - 没有想到从前瞻中捕获while模式。 –