3

我有一个字符串,其中可能包含新行 '\n' 字符。现在我想在该字符串中的每 4(或 N)个字符之后插入新行 '\n' 。

例如:

1) 输入:“我是 John Doe。”

输出:“我是\nJohn\nDoe”

在上面的示例中,在 4 个字符(包括空格)之后插入 '\n'

2)输入:“我\nam John Doe”

输出:“我\nam J\nohn \nDoe”

在上面的示例中,在字符串中已经存在第一个 '\n' 之后的 4 个字符之后插入空格

3) 输入:12345\n67890

输出:1234\n5\n6789\n0

4) 输入:“1234\n56\n78901”

输出:“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;
}

我在每次按键时调用此函数并传递原始字符串并获取输出并进一步使用它。我希望你明白我在这里的意思。它应该保留以前插入的新行。

让我知道我可以进一步解释。有更多的例子。

4

5 回答 5

5

这是我对所要求的内容的最佳猜测:

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
于 2013-05-19T08:47:26.860 回答
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."
于 2013-05-19T09:38:10.603 回答
0
  1. 用 "\n" str.split("\n") 分割字符串。你得到一个字符串数组。
  2. 进行额外的解析和操作,检查元素长度并将结果放入新数组results中。
  3. 使用 results.join("\n") 连接字符串。

如果您避免将“\n”附加或添加到结果元素,这也将删除“\n”重复项。

于 2013-05-19T07:58:49.220 回答
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.");
于 2013-05-19T08:18:27.917 回答
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"

于 2013-05-19T09:26:55.040 回答