如何在javascript中的N个字符计数后插入新行

How to insert new line after N char count in javascript?

本文关键字:插入 新行 字符 javascript 中的      更新时间:2023-09-26

我有一个字符串,其中可能有新行'''n'字符。现在我想在该字符串中每4个(或n个(字符后插入新行'''n]。

例如:

1(输入:"我是无名氏。">

输出:"我是John">

在上面的例子中,在包含空格的4个字符后插入"''n">

2(输入:"我是无名氏">

输出:"I''nam J''nohn''nDo">

在上面的例子中,在字符串中已经存在的第一个"''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;
}

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

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

以下是我对所需内容的最佳猜测:

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
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."
  1. 用"''n"str.Split("''n"(拆分字符串。得到一个字符串数组
  2. 执行额外的解析和操作,检查元素长度并将结果放入新数组results
  3. 使用results.Join("''n"(连接字符串

如果您避免在结果元素中附加或前置"''n",这也将删除"''n"个重复项。

这是我的代码:

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