-2

我有以下内容:

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

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

4

4 回答 4

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", "..."]

此实现不会处理嵌套的括号。对于常规语言,这样的条件本质上是困难的。

(编辑:@DavidUnric 指出 OP 暗示他不希望结果中有括号。所以我们添加 captures 和 flat_map 以减少匹配的替代项。)

于 2013-02-15T22:41:38.517 回答
0

由于 split 也可以采用 RegExp,因此可以根据要求轻松拆分字符串:

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

IE。由任意数量的空格或单个空格包围的括号分割。

于 2013-02-15T22:39:27.687 回答
0
"word1 word2 word3 (compound word) ...".scan(/\(.*?\)|\S+/)
于 2013-02-16T05:14:48.177 回答
-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);
}
于 2013-02-15T22:33:21.530 回答