首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用于匹配双引号引用的单引号的Regex

用于匹配双引号引用的单引号的Regex
EN

Stack Overflow用户
提问于 2016-03-23 16:35:05
回答 2查看 1.9K关注 0票数 3

这里有一个Regex,我一直在努力让它发挥作用:

代码语言:javascript
代码运行次数:0
运行
复制
(?:"[^"]*"[^"]*)*?\"{1}([^"]*?([']{1,})[^"]*?)\"

这可能不是实现我想要做的事情的最干净和最有效的方法,但我想我已经快到了。

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

以下是几个例子:

  • 这是一个随机的句子'有一个引语,这个引号应该与匹配
  • “这里没有引语,这就是问题所在”,这里的任何东西都不应该与相匹配,但现在它已经匹配了:'。
  • “一些文本”更多的文本“这个是一句名言:‘那应该匹配’
  • “当这里有一句话('),另一个不起作用:‘’和‘这是完美的’,即使你删除第一个:”(')“会使它工作,因为贪婪(我认为),但如果你删除括号之间的那些,另一个是匹配的,从现在起,我不想发生。”
  • 另一个例子是:以下内容不应该有效,但它确实“这是被引用的”而不是这个:(')“而且这个也是被引用的”

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-23 19:20:30

好吧,这是一个对所有样本都有效的正则表达式--但是它有点长,而且并不是完全可读的。我希望java模式的所有转义都是正确的。

代码语言:javascript
代码运行次数:0
运行
复制
(?:(?:^|\\G(?<!^)[^'\"]*\")[^\"]*+(?:"[^\"']*"[^\"]*)*+"|\\G(?<!^))[^'\"]*+(')

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

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

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

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

但是我想一个演示展示的效果比我能解释的要好得多,所以下面是:https://regex101.com/r/tW5xH4/1

票数 2
EN

Stack Overflow用户

发布于 2016-03-23 18:28:12

如果您计划以任何方式迭代,我会考虑先迭代以获取双引号中的所有内容,然后使用以下正则表达式:

"(.*?)“

这做了一个非贪婪(首先)匹配之间的引号之间的一切。

(请参阅其他在引号之间获取内容的方法:RegEx: Grabbing values between quotation marks)

一旦在双引号对中包含了所有字符串,那么匹配这些字符串中的任何单引号将是非常简单的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36183788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档