次の内容の行があります。
"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が結果に括弧を入れたくないことを意味していると指摘しています。そのため、キャプチャとflat_mapを追加して、一致した代替に減らします。)
"word1 word2 word3 (compound word) ...".scan(/\(.*?\)|\S+/)
split も RegExp を取ることができるので、要求に応じて文字列を分割するのは簡単です:
irb> "word1 word2 word3 (compound word)".split(/ *\((.*)\) *| /)
=> ["word1", "word2", "word3", "compound word"]
すなわち。任意の数のスペースまたは単一のスペースで囲まれた括弧で分割されます。
これを試してください: 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);
}