Java,在正则表达式中转义(使用)引号

时间:2011-06-18 19:25:16

标签: java regex escaping

我正在尝试在Java中使用以下正则表达式,它应该匹配任何lang="2-char-lang-name"

String lang = "lang=\"" + L.detectLang(inputText) +"\"";
shovel.replaceFirst("lang=\"[..]\"", lang);

我知道单个斜杠会被正则表达式解释为斜杠而不是转义字符(所以我的代码不起作用),但如果我转义斜杠,"将不会被转义更多,我会得到一个语法错误。

换句话说,如何在正则表达式中包含""lang=\\"[..]\\""无效。我也尝试了三个斜杠,也没有任何匹配。

我也知道你不使用正则表达式来解析XML / HTML的一般规则。 (而shovel是一个XML)但是,我正在做的是,寻找一个位于XML的前30个字符内的lang属性,并且我想要替换它。在这种情况下使用正则表达式真的是个坏主意吗?我不认为使用DOM会更好/更有效。

2 个答案:

答案 0 :(得分:5)

三个斜杠是正确的(\\ + \"变为\ + " = \")。 (更新:实际上,事实证明甚至没有必要。看起来单个斜杠也有效。)问题是你使用[..]; []符号表示“此处的任何字符”(因此[..]仅表示“任何字符”)。

放弃[],你应该得到你想要的东西:

String ab = "foo=\"bar\" lang=\"AB\"";
String regex = "lang=\\\"..\\\"";
String cd = ab.replaceFirst(regex, "lang=\"CD\"");
System.out.println(cd);

输出:

foo="bar" lang="CD"

答案 1 :(得分:2)

你用一个反斜杠尝试过吗?

的输出
public static void main(String[] args) {
  String inputString = "<xml lang=\"the Queen's English\">";
  System.out.println(inputString.replaceFirst("lang=\"[^\"]*\"", "lang=\"American\"" ));
}

<xml lang="American">

如果我正确地读你,那就是你想要的。

编辑添加:单个反斜杠工作的原因是它实际上不是字符串的一部分,它只是表达字符串的语法的一部分。字符串"\""的长度为1,而不是2,方法replaceFirst只看到包含"的字符串(没有反斜杠)。这就是为什么\s(正则表达式中的空白字符类)必须在Java字符串文字中写入\\s

关于使用正则表达式的智慧:如果您确定要处理的文件的格式,这应该没问题。如果这些文件可能包含一个注释掉的标题,并且在真实标题上方有lang规范,那么您可能会遇到麻烦!