繁体   English   中英

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

[英]Java, escaping (using) quotes in a regex

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

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

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

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 = "<xml lang=\"the Queen's English\">";
  System.out.println(inputString.replaceFirst("lang=\"[^\"]*\"", "lang=\"American\"" ));
}

<xml lang="American">

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM