【问题标题】:Java regex to match quoted string with embedded escaped quoteJava 正则表达式将带引号的字符串与嵌入的转义引号匹配
【发布时间】:2015-11-11 22:24:22
【问题描述】:

我需要正则表达式的帮助,以匹配可能具有嵌入转义引号的带引号的字符串。

例如,给定字符串"'John\'s bike'"。我开始使用的基本模式"'[^']*'",并使用lookbehind 将其扩展为否定嵌入转义引号的情况不起作用:"'((?<\\)[^'])*'"

有人知道吗?

字符串可以是一系列带引号的字符串,例如“'John\'s bike'、'Mary\'s hat'、'my shoes'”,我想分别标记每个带引号的子字符串。

【问题讨论】:

  • 您没有向我们充分证明您的问题是什么。为什么不能只使用捕获单个测试用例的“'.*'”。演示here你不想捕捉“约翰的自行车”吗?
  • 添加双引号作为正则表达式 "' .. '" 的一部分后,您将引入双分隔符。真的不太好。通过双定界符,我的意思是一个由 2 个字符组成的定界符,它们具有打开/关闭特定的上下文。喜欢"'hello\'" 世界匹配吗?

标签: java regex escaping


【解决方案1】:

您可以接受引号之间的任何字符,即

  • 前面是\
  • 不是'

所以你的正则表达式看起来像:

'(\\.|[^'])*'

在Java中应该看起来像"'(\\\\.|[^'])*'"(要在正则表达式中创建\文字,我们需要像\\一样对其进行转义,但同样的规则适用于字符串文字,所以我们需要再次转义这两个\,最后给我们"\\\\")

基于您的示例的演示:

String input = "'John\\'s bike', 'Mary\\'s hat', 'my shoes'";
Pattern p = Pattern.compile("'(\\\\.|[^'])*'");
Matcher m = p.matcher(input);
while(m.find()){
    System.out.println(m.group());
}

输出:

'John\'s bike'
'Mary\'s hat'
'my shoes'

【讨论】:

  • 我怎么没想到呢?我通过明确地寻找逃避的反弹使它变得更加复杂。谢谢!
  • \\" 失败。正则表达式 "(\\\\[^\\\\]|[^\"])*" 应该可以解决问题。
  • @mvallebr 失败是什么意思? \\" 代表什么? IMO 它代表转义的\ 而不是转义的",在这种情况下,我们可以将" 视为开始\结束报价(我假设在您的情况下" 是引号,而不是')。
  • 最初的问题没有提到转义反斜杠。我从没想过这是一个要求。对我来说,要求只是转义引号,仅此而已。
  • 那么foo\到底应该怎么放在引号的末尾呢?如果我们写成"...foo\",它将代表foo并转义",所以\消失(这不是我们想要的)。
猜你喜欢
  • 2011-12-04
  • 1970-01-01
  • 2014-05-12
  • 2010-09-13
  • 2011-09-25
  • 1970-01-01
  • 2023-03-27
  • 2016-08-08
  • 2011-01-30
相关资源
最近更新 更多