我有以下内容:
"word1 word2 word3 (compound word) ..."
我需要一个正则表达式将单词分隔成一个数组,将括号中的单词视为一个单词,其余的由空格分隔。
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 以减少匹配的替代项。)
由于 split 也可以采用 RegExp,因此可以根据要求轻松拆分字符串:
irb> "word1 word2 word3 (compound word)".split(/ *\((.*)\) *| /)
=> ["word1", "word2", "word3", "compound word"]
IE。由任意数量的空格或单个空格包围的括号分割。
"word1 word2 word3 (compound word) ...".scan(/\(.*?\)|\S+/)
试试这个: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);
}