寻找匹配所有单词的正则表达式,除了[括号内]

时间:2009-10-31 00:39:37

标签: ruby regex

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

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

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

/\[(.*)\]/i

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

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

感谢任何帮助。谢谢!

6 个答案:

答案 0 :(得分:3)

也许你可以分两步完成:

  1. 删除括号内的所有文字。
  2. 使用正则表达式匹配剩余的单词。
  3. 使用单个正则表达式尝试做这两件事最终会比它需要的更复杂。

答案 1 :(得分:1)

怎么回事:

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

答案 2 :(得分:1)

您使用的是哪个Ruby版本?如果它是1.9或更高,这应该做你想要的:

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

答案 3 :(得分:0)

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

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

在将结果存储在string1中时,我的头顶与你删除的内容不匹配?我还没有测试过这个。我可能稍后再测试一下。

答案 4 :(得分:0)

我同意Shhnap的观点。没有更多信息,听起来最简单的方法是删除你不想要的东西。但它需要是/((.*?)]/而不是。之后你可以分开\ s。

如果你试图遍历每个单词,并且你希望每个单词匹配,也许你可以用:string.split(/ \ W + /)作弊。你会失去引用而不是,但是你会得到每个字。

答案 5 :(得分:0)

这似乎有效:

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

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

顺便问一下,你有没有理由在其中捕捉带破折号的单词?如果不需要,你的正则表达式可以简化。