我正在尝试在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会更好/更有效。
答案 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
规范,那么您可能会遇到麻烦!