假设我有一个表达a?.foo("xyz?abc")
,我想在a?.foo
使用正则表达式来摆脱?
但内部没有"xyz?abc"
的一个过滤器内的字符,该怎么办?正则表达式:在表达式中而不是引号
注意我用Java
假设我有一个表达a?.foo("xyz?abc")
,我想在a?.foo
使用正则表达式来摆脱?
但内部没有"xyz?abc"
的一个过滤器内的字符,该怎么办?正则表达式:在表达式中而不是引号
注意我用Java
您必须首先捕获双引号内的内容,例如:
String subject = "a?.foo(\"x\\\"yz?abc\").bar(\"123?456\")";
String regex = "(?s)(\"(?>[^\\\\\"]++|\\\\{2}|\\\\.)*\")|\\?";
String result = subject.replaceAll(regex, "$1");
真棒!我想我应该切换到这一个 –
System.out.println("a?.foo(\"xyz?abc\")"
.replaceAll("(\".*?\"|\\?)", "$1§")
.replaceAll("\\??§", ""));
我要么替换字符或字符串“...”用特殊字符未使用§
, ,然后用一个可选的字符删除§
在一起。
不错的解决方案,thx很多。唯一值得关注的是性能方面。但无论如何,我现在要使用这一个 –
String s = "a?.foo(\"xyz?abc\")";
System.out.println(s.replaceAll("(a\\?\\.)", "a."));
但我想这不是你要求的,对吗?
不,解决方案中不应该存在“a”,这只是一个例子 –
这是一个使用Matcher
的appendReplacement
功能的解决方案。
基本上,我们搜索"(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());
}
}
听起来不错,但我仍然喜欢卡西米尔的答案,因为它的风格简单。不过,无论如何,我会给你一个补偿。谢谢鲍里斯! –
@green你说得对,那个解决方案很整洁 - 没有想到从前瞻中捕获while模式。 –
什么不匹配的引号?可以逃脱报价吗? –
一个逃脱的报价将被放在一个外部引号内,所以它不应该是一个问题。无与伦比的引号是一个错误,不应该在这里考虑。然而,它需要考虑有多个引号对的情况,例如'a?.foo(“xyz?abc”)。bar(“123?456”)' –