【问题标题】:Java, escaping (using) quotes in a regexJava,在正则表达式中转义(使用)引号
【发布时间】:2011-09-17 21:47:49
【问题描述】:

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

【问题讨论】:

标签: java regex escaping


【解决方案1】:

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

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

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

输出:

foo="bar" lang="CD"

【讨论】:

  • 啊,是的,我并没有真正解析他在[..] 那里所做的事情。我认为在[] 内部,. 是按字面意思解释的,所以[..] 的意思是“任何单个字符,可以是..”。
  • 当...你是对的,'猜猜我的正则表达式已经生锈了。谢谢。
【解决方案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 规范,那么您可能会遇到麻烦!

【讨论】:

  • 不,它是格式良好的 xml,带有标准等等。感谢您指出一个斜杠就可以了。我认为它不会,因为它也是一个正则表达式特殊字符。
  • 正则表达式看不到单斜杠。单斜杠是java中字符串编写方式的一部分,因此“\”是长度为1的字符串。“\\”也是如此,它是一个包含斜杠的字符串,正如您所说的那样,它是一个正则表达式元字符。” \\\\" 是长度为 2 的字符串。如果您将其作为正则表达式传递,则在这种情况下,第一个斜杠会转义第二个。
猜你喜欢
  • 2021-06-04
  • 1970-01-01
  • 2018-10-20
  • 2013-01-04
  • 1970-01-01
  • 2019-12-29
  • 2011-05-01
  • 2013-05-10
  • 1970-01-01
相关资源
最近更新 更多