2017-09-24 15 views
0

私は文字列の配列を与えられています。それは大括弧で囲まれたテキストです。 Ex。私が好きな配列の文字列をJavascriptで2つのグループに分割/分割する方法

"John sees his neighbor and greets 'Hello!' [waves]. But she didn't hear him." 

最終的な結果は、アクションタグが動作中speechArrayの上になるように、actionArrayは、各文字の間隔を置いて配置されるだろう

actionArray = "           [waves] 

speechArray = "John sees his neighbor and greets 'Hello!'.  But she didn't hear him." 

だろう。私は次の方法でこの問題に近づいてきました。

var array = data.toString().split("\n"); 
    for(i in array) { 
    var actionArray = ""; 
    var speechArray = ""; 
    for (var letter in array[i]){ 
     if (array[i][letter] == "["){ 
     actionArray += array[i][letter]; 
     letter++; 
     while(array[i][letter] !== "]"){ 
      actionArray += array[i][letter]; 
      letter++; 
     } 
     if (array[i][letter] == "]"){ 
      actionArray += array[i][letter]; 
     } 

     } 

     if (array[i][letter] !== "["){ 

     speechArray += array[i][letter]; 
     actionArray += " "; 
     } 

だから、アクションブラケットと文字列の一部を抽出するために、私は、「[」見つけ、それがない場合、それはactionArrayに追加するかの方法を持っている場合とを加算して保持します私が終了タグを見つけた後に中止したところで、カウンタletterは動作しません。したがって、文字列全体がspeechArrayにコピーされてしまいます。そして、私はこのような何かを得ることになります

actionArray = "           [waves] 

speechArray = "John sees his neighbor and greets 'Hello!'.[waves] But she didn't hear him." 

私はこれをどのようにアプローチするのかよく分かりませんが、Javascriptの新機能です。誰かが私に彼の正しい方向を教えてもらえますか?ありがとうございました!

あなたが続く1文字以上続くと "]"含む "["以内に始まる文字に一致するように RegExp /\[.+\]/String.prototype.match()、および String.prototype.replace()を使用することができます
+0

[置換](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace)で正規表現を使用する – Ammar

+1

あなたがしようとしていることは少し不明です行う。あなたの変数の名前は "Array"と言いますが、値を書いたように、文字列のように見えます。 – Will

+0

は、各文字列に対して1つの 'replace'文が必要な解決策を投稿しました(actionStringのための1つの文とspeechStringのための1つの文)。あなたがしたい場合はそれを見てみましょう。ご質問がある場合は、コメントを残してください:) –

答えて

-1

String.prototype.repeat()

let str = "John sees his neighbor and greets 'Hello!' [waves]. But she didn't hear him."; 
 

 
let re = /\[.+\]/; 
 

 
let match = str.match(re); 
 

 
let res = " ".repeat(match.index) + match[0] 
 
      + " ".repeat(str.length - (match.index + match[0].length)); 
 

 
str = str.replace(re, " ".repeat(match[0].length)); 
 

 
let pre = document.querySelector("pre"); 
 

 
pre.textContent = res + "\n" + str;
<pre></pre>

+0

同じ文字列内に2つ以上の「アクション」はありますか? – georg

+0

@georg '' [] ''の複数の一致は考慮されませんでした。 OPは元の質問のテキスト内に「[]」の複数のマッチを挙げていますか? パターンを調整して、インデックスをインクリメントして複数の一致を処理することができます。 – guest271314

+0

@georgあなたはOPでの要件として明示的には言及されていませんが、要件が複数の一致 "[]"であると推測すべきだと提案していますか? – guest271314

0

あなたはこれをチェックすることができます簡単なコードスニペット:

出力は次のようになります。

          [waves]       
John sees his neighbor and greets 'Hello!'  . But she didn't hear him. 
0

私は実装の下に、多分それはあなた

var arr = "John sees his neighbor and greets 'Hello!' [waves]. But she didn't hear him." 

var p = arr.split(/\s+/) 

var c = p.map(value => { 

    if (/^\[.*\]/.test(value)) 
     return value; 
    else 
     return " " 
}) 

var command = c.join(" "); 
var strings = arr.replace(/\[.*\]/, " ".repeat(command.match(/\w+/)[0].length)) 


console.log(command) 
console.log(strings) 
0

正規表現でシンプルなソリューションのためにOKかもしれない持っています。

まず簡単な部分(speechString):それはちょうどスペースの数と[...]を置き換え

var speechString = string.replace(/(\[[^\]]*\])/gi, (v)=>' '.repeat(v.length)); 

は、一致の長さに等しいです。

今難しい部分(actionString):

var actionString = ((string)=>{ 
    var ret = ''; 
    var re = /(\[[^\]]*\])/gi; 
    var l = 0; 
    while((m = re.exec(string)) != null) { 
     ret += ' '.repeat(m.index-l) + string.substring(m.index, m.index+m[1].length); 
     l = m.index+m[1].length; 
    } 
    return ret; 
})(string); 

それはのような[...]を見つけるために、同じ正規表現を定義しますが、文字列を構築するために、インデックス(試合のpostion)とマッチの長さを使用しています期待される。

Hereは動作中のフィドルです。

var actionString = string.replace(/([^\[]*)(\[[^\]]+?\])?/g, (v,p1,p2)=>{ 
    return (p1?' '.repeat(p1.length):'')+(p2||''); 
}); 

マッチのすべての文字と[...]式をとp2を付加第一グループ長の長さのスペースに置き換えます actionStringはまた、1つの文で検索することができます


EDIT一致。

関連する問題