正则表达式匹配由双引号

时间:2016-03-23 16:35:05

标签: java regex

这是我一直在努力工作的正则表达式:

(?:"[^"]*"[^"]*)*?\"{1}([^"]*?([']{1,})[^"]*?)\"

这可能不是实现我想做的最干净也最有效的方式,但我认为我几乎就在那里。

我的目标是匹配双引号(")之间引用的任何单引号('),以便在它面前需要有一定数量的双引号。我知道现在它只匹配第一组单引号,这很好。我将最终使用这个正则表达式替换第一次出现然后迭代并再次使用它来替换其他的只要有一些。

以下是一些例子:

  • "这是一个带有引号的随机句' 引用应匹配"
  • "这里没有引用问题"此处的任何内容不应与匹配,但现在确实如此:'
  • "一些文字"更多文字"这个是一个引用:'应匹配"
  • "当这里有引号(')时,另一个不起作用:" '那是完美的"即使你删除了第一个这个:" (')"因为贪婪(我认为)会让它发挥作用,但如果你在括号之间移除它们,那么另一个就像现在一样匹配,我不想发生这种情况。
  • 另一个例子就是这个:以下不应该有效,但确实如此"这是被引用的"不是这个:(')"这也被引用"

请注意,我真的不认为自己是专家,前几天我几乎什么都不知道,除了经典[a-zA-Z0-9] ......欢迎任何帮助,我可能忽略了一些基本的东西。 / p>

我一直在这里工作: https://regex101.com/r/aE7iB8/1

2 个答案:

答案 0 :(得分:2)

嗯,这是一个适用于所有样本的正则表达式 - 但它有点长,而且不太完全可读。我希望我能正确获得java模式的所有转义。

(?:(?:^|\\G(?<!^)[^'\"]*\")[^\"]*+(?:"[^\"']*"[^\"]*)*+"|\\G(?<!^))[^'\"]*+(')

这使用了\G - 匹配器,它将在最后一个模式的末尾和后置修饰符匹配,以避免不必要的回溯。

让我们从最后开始,[^'\"]*+(')匹配任何字符,这不是单引号或双引号后跟单引号,而是被捕获到一个组中。

在最后一场比赛结束时

\\G(?<!^)匹配((?<!^)用于确保我们不在字符串的开头,因为这是\G的位置第一次运行,在任何匹配之前。所以我们只会尝试,如果在双引号内有另一个单引号我们在最后一场比赛。

(?:^|\\G(?<!^)[^'\"]*\")[^\"]*+(?:"[^\"']*"[^\"]*)*+"用于跳过双引号之外或不包含单引号的所有序列。 ^|\\G(?<!^)[^'\"]*\"匹配字符串的开头(第一个匹配)或匹配,直到我们上一个匹配的结束双引号,如果内部没有其他单引号。 [^\"]*+然后匹配任何不是双引号的东西。 (?:"[^\"']*"[^\"]*)*+"然后匹配任何不包含单引号和单引号之外的序号的双引号,直到我们达到双引号开始匹配单引号。

但是我想一个演示显示它比我解释的更好,所以你在这里:https://regex101.com/r/tW5xH4/1

答案 1 :(得分:1)

如果您打算反复进行迭代,我会考虑使用此正则表达式迭代以获取双引号内的所有内容:

“(。*?)”

这对一对引号之间的所有内容进行非贪婪(第一次)匹配。

(请参阅此处在引号之间抓取内容的其他方式:RegEx: Grabbing values between quotation marks

一旦你在双引号对中包含所有字符串,匹配这些字符串中的任何单引号都是微不足道的。