如何在 JavaScript 中每 N 个字符插入新行?

3
我有一个字符串,其中可能包含换行符“\n”。现在我想在该字符串中的每4个字符(或N个字符)后插入换行符“\n”。
例如:
1) 输入:“I am John Doe.” 输出:“I am\nJohn\nDoe” 在上面的示例中,将在包括空格在内的4个字符后插入“\n”
2) 输入:“I\nam John Doe” 输出:“I\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;
}

我在每次按键时调用此函数,并传递原始字符串以获取输出并进一步使用它。我希望你理解我在这里想说的意思。它应该保留先前插入的换行符。
如果需要,我可以提供更多示例来解释。

请确认您的第二个示例,第一个插入的 \n 在 5 个字符后面,为什么?更多的示例也会有所帮助。我也觉得在 \n 字符周围加上 * 很令人困惑,请确保输入和输出正好是您需要的字符串。 - HBP
我已经删除了“*”。请不要考虑引号,它只是用来表示字符串的。 - ʞɹᴉʞ ǝʌɐp
谢谢您指出这个问题,我已经在 Doe 前面添加了 \n。 - ʞɹᴉʞ ǝʌɐp
1
你的第一个例子不应该也有一个\n吗?那么这个字符串应该转换成什么样子:'ABCD\nEFGH\nIJKL' - 是简单地保留现有的换行符,还是添加额外的换行符?我们所有人都在猜测的原因是你没有编写完整的规范。你需要解释每个边缘情况下想要什么,并提供输入和输出的全面列表。 - Michael Geary
@deepak 我明白了,我会更新我的答案。 - Novak
显示剩余12条评论
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

谢谢。它返回了预期的结果。 - ʞɹᴉʞ ǝʌɐp

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."

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"


0
  1. 通过 "\n" 进行字符串分割 str.split("\n"),你将得到一个字符串数组。
  2. 进行额外的解析和操作,检查元素长度并将结果放入新数组 results 中。
  3. 使用 results.join("\n") 进行字符串连接。

如果避免在 results 元素中添加或前置 "\n",这也将删除 "\n" 的重复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接