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

我正在尝试在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会更好/更有效。

三个斜杠是正确的( \\ + \"成为\ + " = \" )。( 更新 :事实上,事实certificate,甚至没有必要。似乎单个斜杠也有效。)问题是你的使用[..] ; []符号表示“此处的任何字符”(所以[..]仅表示“任何字符”)。

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

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

输出:

 foo="bar" lang="CD" 

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

 public static void main(String[] args) { String inputString = ""; System.out.println(inputString.replaceFirst("lang=\"[^\"]*\"", "lang=\"American\"" )); } 

  

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

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

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