正则表达式多个匹配

时间:2013-02-15 21:46:48

标签: ruby regex

我有一行内容如下:

"word1 word2 word3 (compound word) ..."

我需要一个正则表达式将单词分成一个数组,将括号中的单词视为单个单词,其余单词用空格分隔。

4 个答案:

答案 0 :(得分:3)

BARE_WORD     = /([^\(\s]\S*)/
COMPOUND_WORD = /\(([^\)]*)\)/
SCANNER       = /(?:#{BARE_WORD})|(?:#{COMPOUND_WORD})/

def split_bare_and_parenthesized_words str
  str.scan(SCANNER).flat_map(&:compact)
end

split_bare_and_parenthesized_words "word1 word2 word3 (compound word) ..."
#=> ["word1", "word2", "word3", "compound word", "..."]

此实现不会处理嵌套的parens。这种情况本质上很难用常规语言。

(编辑:@DavidUnric指出OP意味着他不希望结果中的parens。所以我们添加了capture和flat_map以减少匹配的替代。)

答案 1 :(得分:0)

由于拆分也可以使用RegExp,因此可以轻松地按要求拆分字符串:

irb> "word1 word2 word3 (compound word)".split(/ *\((.*)\) *| /)
=> ["word1", "word2", "word3", "compound word"]

即。被任意数量的空间或单个空间包围的parens分开。

答案 2 :(得分:0)

"word1 word2 word3 (compound word) ...".scan(/\(.*?\)|\S+/)

答案 3 :(得分:-1)

试试这个: http://jsfiddle.net/WtfCA/

function test(str) {
    var bracketStr = str.match(/\([a-z]*\s[a-z]*\)/g, "temp")[0];
    var temp = str.replace(/\([a-z]*\s[a-z]*\)/g, "temp").split(" ");
    var final = temp.join("+").replace(/temp/, bracketStr).split("+");
    console.log(final);
}