2013-05-19 89 views
2

我有一個字符串,它可能有新行'\ n'字符。現在我想在該字符串中每4個(或N個)字符後插入新行'\ n'。如何在javascript中插入N個字符之後插入新行?

例如:

1) INPUT: 「我是李四。」

OUTPUT: 「我\ nJohn \ nDoe」

在上面的例子中後4炭包括空間

2) INPUT插入 '\ n' 的 「I \南John Doe的」

OUTPUT: 「I \南J□\ nohn \ nDoe」

在上面的例子中之後第一 '\ N' 後4個字符已經存在於串中插入空間

3) INPUT:12345 \ n67890

OUTPUT:1234 \ N5 \ n6789 \ N0

4) INPUT: 「1234 \ N56 \ n78901」

OUTPUT:「1234 \ N56 \ n7890 \ N1"

到目前爲止,我已經創建了每4個字符後插入‘\ n’的功能,但它沒有考慮‘\ n’,如果它是在原來的字符串已經存在。

function addNewlines(str) { 
    if (str.length >= 4) { 
    var result = ''; 
    while (str.length > 0) { 
     result += str.substring(0, 4) + '\n'; 
     str = str.substring(4); 
    } 
    return result; 
    } 
    return str; 
} 

我在每次按鍵時調用此函數並傳遞原始字符串並獲取輸出並進一步使用它。我希望你明白我在這裏要說的話。它應該保留先前插入的新行。

讓我知道我可以進一步解釋。隨着更多的例子。

+0

請確認您的第二個例子,第一個插入\ n是5個字符後,爲什麼?更多的例子也有幫助。我還發現'\ n'字符周圍的*會令人困惑,請準確輸入和輸出您需要的字符串。 – HBP

+0

我已刪除*。請不要考慮它只是表示字符串的引號。 –

+0

你的描述說你想在每個* 4個字符之後添加一個換行符(或者現有換行符之後的四個字符),但是你的例子只顯示一個添加到字符串中的*單行*換行符。這是什麼,總共只添加一個換行符,或者每四個字符後換行符? –

回答

2

這是我最好的猜測,被問什麼是:

function addNewLines (str) { 
     return str.replace (/(?!$|\n)([^\n]{4}(?!\n))/g, '$1\n'); 
} 

一些測試字符串及其結果:

"I am John Doe.", -> "I am\n Joh\nn Do\ne." 
"I\nam John Doe", -> "I\nam J\nohn \nDoe" 
"12345\n67890",  -> "1234\n5\n6789\n0" 
"1234\n56\n78901", -> "1234\n56\n7890\n1" 
"ABCD\nEFGH\nIJKL", -> "ABCD\nEFGH\nIJKL\n" 
"1234",    -> "1234\n" 
"12341234"   -> "1234\n1234\n" 

對於那些對他們來說,正則表達式是神祕這裏是一個細分:

---------------------------- (?!  Check that following character(s) are not     
    | ------------------------- $|\n Beginning of string or a newline character     
    | | ---------------------)     
    | | | -------------------- (  Start of capture group 1   
    | | || ------------------ [^\n] Any single character other than newline   
    | | || | -------------- {4} Previous element repeated exactly 4 times   
    | | || | | ----------- (?! Check that following character(s) are not 
    | | || | | | ---------  \n a newline  
    | | || | | | | ------- )  
    | | || | | | | |------)  End of capture group 1 
    | | || | | | | || ---- /g  in replace causes all matches to be processed 
    | | || | | | | || | 
/(?!$|\n)([^\n]{4}(?!\n))/g 
+0

謝謝。它返回預期的結果。 –

0
  1. 將字符串拆分「\ n」str.split(「\ n」)。你得到一串字符串。
  2. 做額外的解析和操作檢查元素長度並將結果放入新數組結果
  3. 使用results.join(「\ n」)加入字符串。

這將刪除「\ n」個重複太多,如果你避免追加或前面加上「\ n」來結果元素。

0

這裏是我的代碼:

function ngram_insert (n, ins, input) 
{ 
    var output = ""; 
    var i = 0; 

    while (i < strlen(input)) 
    { 
     if (i > 0 && i % n == 0) 
     { 
      output += ins; 
     } 

     output += input[i]; 

     i++; 
    } 

    return output; 
} 

測試:

var output = ngram_insert (3, "\n", "This is a test."); 
0
function f(n, ins, str) { 

     if (str.length == 0) 
      return ""; 

     var i = str.indexOf("\n"), len = str.length, newStr; 
     if (i == -1) { 
      i = 1; 
      newStr = str[0]; 
     } 
     else { 
      newStr = str.substring(0, i + 1); 
     } 

     var k = 1; 

     while (k + i < len) { 
      newStr += str[k + i]; 

      if (k % n == 0) { 
        newStr += ins; 
      } 

      k++; 
     } 

     return newStr; 
} 

調用f(4, "\n", "I\nam John Doe");回報"I\nam J\nohn \nDoe"

1
function parseInput(str, char, length){ 
    var split = str.split(char), 
     regex = RegExp('(.{' + length + '})','g'); 

    split[split.length-1] = split[split.length - 1].replace(regex, '$1' + char); 
    return split.join(char); 
} 

console.log(parseInput("I am John Doe.", "\n", 4)); 
// output = "I am\n Joh\nn Do\ne." 
相關問題