如果我有字符串"This is > than" something 1=3 and "else = true"
(不要试图理解它的意思,它只是一个例子:P)我怎样才能替换引号中没有包含的自定义模式?例如,替换&#39; =&#39;(等于)运算符,第一个运算符,让我们说&#39;&lt;&#39;产生字符串"This is > than" something 1<3 and "else = true"
。提前谢谢。
答案 0 :(得分:1)
您可以尝试使用以下正则表达式将=
之外的所有"
替换为<
符号。
=(?=(?:[^"]*"[^"]*")*[^"]*$)
替换字符串:
<
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})*[^"]*$)
并将其替换为:
<
在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);