【问题标题】:Using JavaScript RegExp to match the first item in a list surrounded by parentheses使用 JavaScript RegExp 匹配被括号括起来的列表中的第一项
【发布时间】:2012-02-11 13:09:04
【问题描述】:

我有一个文本字符串,我试图用 JavaScript 中的 RegExp 解析。假设它看起来像这样:

var myString = "This is a string of text (item item item) and more text here.";

我需要匹配单词“item”的第一次出现,因为它是括号内的第一项。我不知道如何编写一个只匹配一组括号内的第一项的模式。

你们中的一些人可能想这样想:假设我正在解析一个 Lisp 字符串并想要匹配所有汽车。

提前致谢。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    使用这样的东西:

    /\((\w*?)(?:\s|\))/
    

    现场示例:http://tinkerbin.com/EJyjEX30(点击运行运行代码))

    【讨论】:

    • 当字符串为'(item)'时失败
    • 这确实有帮助,但问题是我正在尝试为其他人创建的词法分析器制作插件。除非我可以让模式只返回捕获组,否则我会卡住,因为我没有办法告诉词法分析器使用捕获组而不是实际匹配。
    • 查看我如何获得第一组的实时示例:myStr.match(/\((\w*?)(?:\s|\))/)[1]
    • 只要我访问捕获组,这两个答案都有效,但问题是在这种特殊情况下,我没有。我想如果是这样的话,这可能是不可能的?
    • 您正在寻找lookbehind? (?<=H)\w 匹配 H 后的一个字母。例如,'Hello' 将匹配 'e'。但不幸的是,JS 不支持lookbehinds...
    【解决方案2】:

    如果您可以避免检查左括号,则可以对右括号使用前瞻。

    item(?=[^\)]*\))
    

    您还可以通过以下方式使用捕获组:

    \(.*?(item).*?\)
    

    编辑

    对于括号中某处至少重复一次的单词:

    \(.*?(\b\w+\b).*?\1.*?\)
    

    编辑 2

    对于括号中的第一组字母数字字符:

    \([^\w]*(\b\w+\b).*?\)
    

    或者更简单的选择:

    \(.*?\b(\w+)\b.*?\)
    

    【讨论】:

    • 这几乎就是我所需要的。问题是括号中的单词实际上不是“项目”。它们将是一串我事先不知道的字母。
    • 您会一直寻找第一个重复的单词吗?
    • 不,第一个词不太可能重复,但可能会。
    • 哦...所以你只需要 () 中的第一个单词?
    • @AramKocharyan 是的,我想是的。
    【解决方案3】:

    您不能创建与左括号不匹配的模式,因为 Javascript 正则表达式不支持回溯。

    您可能需要更新您的词法分析器代码以了解捕获组(或通用函数或其他方便的东西......),或者您需要重组您的代码,以便它可以处理您无法摆脱的额外括号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 2010-09-22
      相关资源
      最近更新 更多