【问题标题】:Looking for a regex that match all words, except the ones [inside brackets]寻找匹配所有单词的正则表达式,除了[括号内]
【发布时间】:2026-01-23 20:10:01
【问题描述】:

我正在尝试编写一个正则表达式来匹配特定字符串中的所有单词,但会跳过括号内的单词。我目前有一个匹配所有单词的正则表达式:

/[a-z0-9]+(-[a-z0-9]+)*/i

我还有一个匹配括号内所有单词的正则表达式:

/\[(.*)\]/i

我基本上想匹配第一个正则表达式匹配的所有内容,但没有第二个正则表达式匹配的所有内容。

输入文本示例:http://gist.github.com/222857 它应该单独匹配每个单词,而不是括号中的单词。

感谢任何帮助。谢谢!

【问题讨论】:

  • 所以fine young lady from [Venice][1], 变成fine young lady from,?

标签: ruby regex


【解决方案1】:

也许您可以分两步完成:

  1. 删除括号内的所有文本。
  2. 使用正则表达式匹配剩余的单词。

使用一个正则表达式来尝试做这两件事最终会变得比它需要的更复杂。

【讨论】:

  • 是的,我也会这样做。
【解决方案2】:

这个怎么样:

your_text.scan(/\[.*\]|([a-z0-9]+(?:-[a-z0-9]+)*)/i) - [[nil]]

【讨论】:

  • 嘿格伦,你的意思是然后看看第 1 组?这是一种很酷的简单技术,出于某种原因,似乎很少有人使用。 +1! :) 我刚刚在regex bounty quest 上使用它,并在研究是否有人使用该技术时找到了您的答案。
【解决方案3】:

您使用的是哪个 Ruby 版本?如果是 1.9 或更高版本,这应该可以满足您的要求:

/(?<![\[a-z0-9-])[a-z0-9]+(-[a-z0-9]+)*(?![\]a-z0-9-])/i

【讨论】:

    【解决方案4】:

    我认为我没有正确理解这个问题。为什么不像这样创建一个不包含第二个正则表达式的新字符串:

    string1 =~ s/\[(.*)\]//g
    

    在我的脑海中,这与您在将结果存储在 string1 中时删除的内容不匹配?我还没有测试过这个。我可能会稍后测试它。

    【讨论】:

      【解决方案5】:

      我同意 Shhnap 的观点。如果没有更多信息,听起来最简单的方法是删除您不想要的内容。但它需要 /[(.*?)]/ 代替。之后,您可以在 \s 上拆分。

      如果您尝试遍历每个单词,并且希望每个单词匹配,也许您可​​以使用以下方法作弊: string.split(/\W+/) 。您将丢失引号等,但您会得到每个字。

      【讨论】:

        【解决方案6】:

        这似乎有效:

        [^\[][a-z0-9]+(-[a-z0-9]+)*
        

        如果单词的第一个字母是左括号,则不匹配。

        顺便说一句,你捕捉带有破折号的单词有什么原因吗?如果不需要,可以简化您的正则表达式。

        【讨论】:

          最近更新 更多