正则表达式:忽略字符串中引用的内容

时间:2014-09-03 12:19:04

标签: java regex

如果我有字符串"This is > than" something 1=3 and "else = true"(不要试图理解它的意思,它只是一个例子:P)我怎样才能替换引号中没有包含的自定义模式?例如,替换&#39; =&#39;(等于)运算符,第一个运算符,让我们说&#39;&lt;&#39;产生字符串"This is > than" something 1<3 and "else = true"。提前谢谢。

3 个答案:

答案 0 :(得分:1)

您可以尝试使用以下正则表达式将=之外的所有"替换为<符号。

=(?=(?:[^"]*"[^"]*")*[^"]*$)

替换字符串:

<

DEMO

System.out.println("\"This is > than\" something 1=3 and \"else = true\"".replaceAll("=(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", "<"));

输出:

"This is > than" something 1<3 and "else = true"

答案 1 :(得分:1)

您可以使用此搜索模式:

=(?=(?:(?:[^"]*"){2})*[^"]*$)

并将其替换为:

<

RegEx Demo

在Javacode中:

String repl = str.replaceAll("=(?=(?:(?:[^"]*"){2})*[^"]*$)", "<");
//=> "This is > than" something 1<3 and "else = true"

答案 2 :(得分:0)

虽然其他答案看起来很简单,但它们是基于测试创建=是否在引文之外的想法,确保其后面的每个"都有其结束",这意味着正则表达式需要迭代你正在测试的=的其余字符串。如果您的字符串很长并且您需要测试许多=,这可能会非常无效。

解决此问题的其他方法可能是查找引用区域或搜索的子字符串。然后,如果我们风引用区域,我们不会改变它,但是当我们找到=时,我们可以应用不同的逻辑(我们可以将其更改为其他类似的情况<)。此解决方案具有以下优势:在查找引用区域时,我们可以使用所有非引号字符,因此我们也将使用我们不想更改的=,这意味着如果我们将匹配{{ 1}}我们确信它不在=内,所以我们可以避免从其他答案中耗费时间。

此类解决方案的可能代码可能类似于

"..."

输出:String text = "\"This is > than\" something 1=3 and \"else = true\""; // This regex will search for areas which starts with ", ends with " and have zero // or more non quotation marks between them. If such area will be found it will be // placed in group named "quotation". Searching for such group have higher priority so // I put this variant before `=` variant (or other variants) Pattern p = Pattern.compile("(?<quotation>\"[^\"]*\")|>=|=|<|>"); Matcher m = p.matcher(text); StringBuffer sb = new StringBuffer(); while (m.find()) { if (m.group("quotation") != null) { m.appendReplacement(sb, m.group("quotation")); } else { m.appendReplacement(sb, "<"); } } m.appendTail(sb); String result = sb.toString(); System.out.println(result);