【问题标题】:Regex get all quoted words that are not also single quoted正则表达式获取所有不是单引号的引用单词
【发布时间】:2017-03-03 22:26:37
【问题描述】:

是否可以使用单个正则表达式获取所有引用的文本?

来自正则表达式的示例文本:

编辑“表达式”和文本以查看匹配项。滚动“匹配”或表达式以获取详细信息。 使用 ctrl-z 撤消错误。 与朋友或社区保存“收藏夹和“分享”表达方式。使用工具“探索”您的结果。库中提供了完整的参考和帮助,或观看视频教程。

在这种情况下,我想捕获 ExpressionmatchesExplore 但不是 Share,因为 'Favorites & "Share" expressions' 是单引号。

【问题讨论】:

  • "Explore" 从结果中丢失?
  • 糟糕,是的,Explorer 也应该被捕获
  • 你可能只需要这个".*?"
  • 他需要前后看看没有'包装@MaciejKozieja
  • 报价是否有任何平衡,或者它们只是先到先得?喜欢Is this "quote start '"quote middle, or "' quote end"

标签: javascript regex


【解决方案1】:

您无法构建仅匹配 Javascript 中您想要的部分的正则表达式,但是您可以构建一个匹配所有字符串且没有间隙的模式,并使用捕获组来提取您想要的部分:

/[^"']*(?:'[^']*'[^"']*)*"([^"]*)"/g
#^----------------------^ all that isn't content between double quotes

由于您的字符串可能以 abcd 'efgh "ijkl" mnop' qrst 之类的结尾(简而言之,没有您想要的部分,但在单引号子字符串中带有双引号部分),将模式更改为更安全:

/[^"']*(?:'[^']*(?:'[^"']*|$))*(?:"([^"]*)"|$)/g

并丢弃最后一个匹配项。

【讨论】:

  • 我通过执行这个得到以下结果:[ "Edit the "Expression"", "Expression" ]
  • @Xeul:您需要提取捕获组 1,为此您必须使用 RegExp.prototype.exec 而不是 String.prototype.match。你可以在这里看到如何使用它:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 是的,我在做 /[^"']*(?:'[^']*'[^"']*)*"([^"]*)"/g.执行(内容)
  • @Xeul: 捕获组 1 是数组中的第二项。再仔细阅读文档,了解RegExp.prototype.exec 的工作原理以及如何将其用于多个匹配项。请参阅示例。
  • 那么这个解决方案只捕获第一个引用的文本?
【解决方案2】:

没有特殊的正则表达式模式:

var mystr = "Edit the \"Expression\" & Text to see matches. Roll over \"matches\" or the expression for details. Undo mistakes with ctrl-z. Save 'Favorites & \"Share\" expressions' with friends or the Community. \"Explore\" your results with Tools. A full Reference & Help is available in the Library, or watch the video Tutorial."
var myarr = mystr.split(/\"/g)
var opening=false;
for(var i=1; i<myarr.length;i=i+2){
    if((myarr[i-1].length-myarr[i-1].replace(/'/g,"").length)%2===1){opening=!opening;}
    if(!opening){console.log(myarr[1]);}
}

工作原理:

  • "分割文本

  • 奇数索引是带有" 包装器的字符串

  • 如果在此索引之前,存在奇数个',则此项目由' 包裹,不应考虑

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 2019-03-26
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多