繁体   English   中英

正则表达式匹配由双引号引用的单引号

[英]Regex to match single quotes being quoted by double-quotes

这是一个正在尝试工作的正则表达式:

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

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

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

这里有一些例子:

  • “这是一个随机一句'有一个报价, 报价应符合
  • “这里没有引用问题”这里的任何东西都不应该匹配,但现在确实如此: '
  • “一些文字”更多文字“这是一个引用:'应该匹配
  • “当这里有引号(')时,另一个不起作用:”'并且那是完美的“即使你删除了第一个:”(')“会因为贪婪而使它成功(我认为)但如果你删除括号之间的那些,那么另一个是现在的匹配,我不想发生。
  • 另一个例子是这一个:以下应该不起作用,但它确实“引用了这个”而不是这个:(')“并且这也被引用”

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

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

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

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

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

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

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

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

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

如果你打算反正迭代,我会考虑使用这个正则表达式迭代以获取双引号内的所有内容:

“(。*?)”

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

(请参阅此处在引号之间抓取内容的其他方法: RegEx:在引号之间抓取

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

暂无
暂无

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

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