我有一行内容如下:
"word1 word2 word3 (compound word) ..."
我需要一个正则表达式将单词分成一个数组,将括号中的单词视为单个单词,其余单词用空格分隔。
答案 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);
}