2017-03-20 13 views
2

テキストがあります。配列の長さに基づいて文字列を単語に分割する

text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do 
     eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim 
     ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut 
     aliquip ex ea commodo consequat.' 

これを分割する方法は、別の配列の長さに基づいて行うことができます。

array = 'sed do' 

は、私が試した:nullを返します

alength = array.split(" ").length; 
array2 = candidate.match('\/((?:(?:\\S+\\s){'+alength+'})|(?:.+)(?=\\n|$))\/g'); 

を。私が取得することを期待していた何

されました:

array 2 = 'Lorem ipsum','dolor sit',...'commodo consequat' 

私は多分使用することができ、別の文字列の方法がありますか?

+1

*「別の配列の長さに基づいてこれを分割するにはどうすればよいですか?」 - 別の文字列の単語数に基づいていますか? (あなたの他の 'array'変数は実際には文字列であり、配列ではありません。名前と説明にかかわらず文字列として扱われていると思います...) – nnnnnn

答えて

1

私は正規表現を使うのが好きですが、正規表現を動的に作成すると混乱することがありますので、別のアプローチを考えてみましょう。たとえば、元の文字列を個々の単語に分割し、必要に応じてグループ化することができます。理解し、保守が容易:

function getPhrases(text, wordsPerPhrase) { 
 
    var words = text.split(/\s+/) 
 
    var result = [] 
 
    for (var i = 0; i < words.length; i += wordsPerPhrase) { 
 
    result.push(words.slice(i, i + wordsPerPhrase).join(" ")) 
 
    } 
 
    return result 
 
} 
 

 
text = `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do 
 
     eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim 
 
     ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut 
 
     aliquip ex ea commodo consequat.` 
 
     
 
console.log(getPhrases(text, 9)) 
 
console.log(getPhrases(text, 5)) 
 
console.log(getPhrases(text, 2))

注:あなたがあなたの出力に句読点をしたくない場合は、あなたがあなたの関数の最初の行として次のようなものを追加することができます。

text = text.replace(/[^a-z'\s]/gi,'') 
+0

注意すべき点は、正規表現はこのような簡単な分割操作を実行するには通常は遅くなります。さらに、式を複数回使用する場合は、プリコンパイルする必要があります。 – Soviut

+0

@Soviut - 表示されている入力では、空白と改行の両方が存在するように見えます。つまり正規表現ではなく '/ \ s + /'です。この式は、関数が呼び出されるたびに1回だけ使用されるという意味で複数回使用されます。私は '/ \ s + /'をコンパイルするのに時間がかかるとは思わない... – nnnnnn

+0

ありがとう、これは私の必要性のために働くようだ! – rlu7732

関連する問題