我正在尝试编写一个匹配特定字符串中所有单词的正则表达式,但跳过括号内的单词。我目前有一个匹配所有单词的正则表达式:
/[a-z0-9]+(-[a-z0-9]+)*/i
我还有一个匹配括号内所有单词的正则表达式:
/\[(.*)\]/i
我基本上想要匹配第一个正则表达式匹配的所有内容,但没有第二个正则表达式匹配的所有内容。
示例输入文字:http://gist.github.com/222857 它应该单独匹配每个单词,而不是括号中的单词。
感谢任何帮助。谢谢!
答案 0 :(得分: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]+)*
如果单词的第一个字母是左括号,则它不匹配。
顺便问一下,你有没有理由在其中捕捉带破折号的单词?如果不需要,你的正则表达式可以简化。