【问题标题】:Regex to match single quotes being quoted by double-quotes正则表达式匹配被双引号引用的单引号
【发布时间】:2016-03-23 16:35:05
【问题描述】:

这是我一直在尝试的一个正则表达式:

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

这可能不是实现我想做的最干净也不是最有效的方法,但我想我快到了。

我的目标是匹配双引号 (") 之间的任何单引号 (')被引用的,因此需要有奇数个双引号在它前面。我知道现在它只匹配第一组单引号,没关系。我最终会使用这个正则表达式替换第一次出现,然后迭代并再次使用它来替换其他的,只要有一些.

这里有几个例子:

  • " 这是一个带有引号的随机句子'引号应该匹配"
  • “这里没有引用就是问题所在”这里的任何内容不应该匹配,但现在可以:'
  • "Some text" some more text" this is a quote : ' that should match"
  • " 当这里有引号 (') 时,另一个不起作用:" ' 这很完美",即使您删除第一个:" (')" 由于贪婪 (我认为 ) 但是如果你删除括号之间的那些,另一个是匹配的,我不希望发生这种情况。
  • 另一个例子是这个:以下应该不起作用,但它确实“这是被引用的”而不是这个:(')“而且这也被引用了”

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

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

【问题讨论】:

  • 我认为你的假设不正确,那就是它前面需要有奇数个双引号(取决于允许的文本)。反例'"""\'"'呢?您绝对应该使用堆栈,而不是使用正则表达式。
  • 我不确定我理解你的意思,如果我们检查它前面是否有奇数个 " ,第二个 ' 不会匹配吗?
  • 这完全取决于您是否允许嵌套引号。无论哪种方式,正则表达式都不适合这项工作。
  • 如果我在它前面添加另一个双引号,它就会不匹配,这就是我的目标:“这是一些引用的文本”这不是“这是”,也许我不明白你的意思
  • 啊,不会有嵌套引号

标签: java regex


【解决方案1】:

嗯,这是一个适用于所有示例的正则表达式 - 但它有点长,而且不是完全可读。我希望我为 java 模式正确地得到了所有的转义。

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

这利用了\G-matcher,它将在最后一个模式的末尾进行匹配,并使用所有格修饰符来避免不必要的回溯。

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

\\G(?&lt;!^) 匹配最后一场比赛的结尾((?&lt;!^) 用于确保我们不在字符串的开头,因为这是第一次运行时\G 的位置,在任何事情之前匹配。所以我们将尝试,如果在我们上次匹配的双引号中还有另一个单引号。

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

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

【讨论】:

  • 这似乎匹配,即使没有结束双引号。
【解决方案2】:

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

"(.*?)"

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

(在此处查看其他在引号之间获取内容的方法:RegEx: Grabbing values between quotation marks

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

【讨论】:

  • 我目前正在用 Java 做这件事,但用 regex 做和/或知道如何做它仍然很好!
  • 这里要说明正则表达式有什么好处,因为在很多情况下,使用您的程序进行处理更有意义。正则表达式(实际上)不是一种编程语言,它(希望)是一种编程语言提供的众多工具之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
相关资源
最近更新 更多