2017-09-24 19 views
0

我給出了一個字符串數組。它是一個帶括號的動作的文本。防爆。如何使用Javascript將一個數組的字符串拆分成兩個組合

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

最終的結果,我想是

actionArray = "           [waves] 

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

的actionArray將被隔開用於每個字符所以動作標籤將是對動作期間speechArray的頂部。我已經用下面的方法解決了這個問題。

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,與IF和增加保持actionArray直到找到結束標記「]」

它的工作原理,但計數器letter不會繼續在那裏我找到關閉標籤後離開,所以整個字符串最終還是被複制到speechArray。然後我最終得到像這樣的東西

actionArray = "           [waves] 

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

我是新來的Javascript,沒有使用指針我不知道如何處理這個。有人能指出我正確的方向嗎?謝謝!

+0

使用正則表達式與[replace](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace) – Ammar

+1

這是有點不清楚你想要什麼做。你的變量的名字是「Array」,但是你寫的值看起來像字符串。 – Will

+0

發佈了一個解決方案,您需要爲每個字符串需要一個'replace'語句(一個語句用於actionString,一個用於speechString)。如果你想要看看它。如果您有任何問題,請留下評論:) –

回答

-1

您可以使用String.prototype.match(),並且String.prototype.replace()RegExp/\[.+\]/匹配字符開頭內"["後跟一個或多個字符,然後和包括"]"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

同一個字符串中的兩個或多個「操作」如何? – georg

+0

@georg沒有考慮到''[]「'的多重匹配。 OP是否在原始問題的文本中提及'「[]」'的多重匹配? 可通過增加索引來調整模式以處理多個匹配。 – guest271314

+0

@georg您是否建議我們應該推斷,要求是針對多個匹配的「」['],儘管這在OP中並未明確提及。 – guest271314

0

您可以檢查此簡單的代碼片段:

var data = "John sees his neighbor and greets 'Hello!' [waves]. But she didn't hear him." 
var arr = data.split(""); 
var action = false; 
var actionstr="",speachstr=""; 
    for(var i=0;i<arr.length;i++){ 
     if(arr[i]=='['){ 
      action = true 
     }else if(arr[i] ==']'){ 

      actionstr = actionstr.concat(arr[i]) 
      speachstr = speachstr.concat(" ") 
      action = false 
      continue 
     } 
     if(action){ 
      actionstr = actionstr.concat(arr[i]) 
      speachstr = speachstr.concat(" ") 
     }else{ 
      actionstr = actionstr.concat(" ") 
      speachstr = speachstr.concat(arr[i]) 
     } 
    } 
    console.log(actionstr) 
    console.log(speachstr) 

輸出應該是:

          [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

使用正則表達式的簡單解決方案。

首先最容易的部分(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); 

它定義了相同的正則表達式找到[...],但使用的索引(匹配的現在的位置)和匹配長度來構建的字符串等預期。

Here是一個工作小提琴。


EDIT actionString也可以由一個單一語句檢索:

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

匹配的所有字符和[...]表達並且在第一組的長度與P2所附的長度用空格替換它比賽。

相關問題