如何分割换行符

152
我正在使用jQuery,有一个textarea。当我通过按钮提交时,我想要弹出每一个由换行符分隔的文本。 如何在遇到换行符时拆分文本?
  var ks = $('#keywords').val().split("\n");
  (function($){
     $(document).ready(function(){
        $('#data').submit(function(e){
           e.preventDefault();
           alert(ks[0]);
           $.each(ks, function(k){
              alert(k);
           });
        });
     });
  })(jQuery);

示例输入:

Hello
There

我想要的结果是:

alert(Hello); and
alert(There)
13个回答

215

不论平台(操作系统)如何,您都应该解析换行符。使用正则表达式可以实现通用的分割。您可以考虑使用以下代码:

var ks = $('#keywords').val().split(/\r?\n/);

例如

"a\nb\r\nc\r\nlala".split(/\r?\n/) // ["a", "b", "c", "lala"]

1
据我所知,这将在Windows和Unix上运行,但不适用于Mac OS X之前的Mac系统。 - Marc
这肯定是最好的答案,毫无疑问 @oknoorap - basse
如果在Windows中使用回车符(^M$),这将无法正常工作。 - Miguel Stevens

102

尝试在您的提交函数中初始化ks变量。

  (function($){
     $(document).ready(function(){
        $('#data').submit(function(e){
           var ks = $('#keywords').val().split("\n");
           e.preventDefault();
           alert(ks[0]);
           $.each(ks, function(k){
              alert(k);
           });
        });
     });
  })(jQuery);

3
alert(k)只会弹出序列号,而不是值。您应该使用alert(ks[k])。 - HBlackorby
2
@hblackorby 您的评论虽然相关,但是对于OP在这里的主要问题——变量“ks”的范围和初始化——有些无关紧要。 - John Hartsock

66

应该这样做

yadayada.val.split(/\n/)

您正在将文本字符串传递给split命令,而不是正则表达式。


5
在 JavaScript 中,"\n"/\n/ 这两个东西完全不同。" 表示字符串(string),而 / 则表示正则表达式(regex)。 - Marc B
27
好的,但是实际上有什么不同呢? "\n"/\n/ 不是匹配相同的内容吗? - Scott Stafford
25
“\n”和/\n/的效果基本相同,但根据您要拆分的源,类似于val.split(/[\r\n]+/)的方式可能更好。如果您的源使用“\r\n”换行符,则在“\n”上进行拆分会使“\r”停留在末尾,从而可能引起问题。 - xtempore
运行得非常好。我正在使用React,所以无法使用jQuery。 - Brandon
你可能还想要使用trim函数来去除结果字符串中的换行符,例如\r - ivanjermakov

37

由于您使用的是textarea标签,因此您可能会发现换行符为 \n 或 \r(或\r\n)。因此,建议使用以下代码:

$('#keywords').val().split(/\r|\n/)

参考:检查字符串是否包含换行符


30
更具体地说,/\r?\n/ 表示匹配换行符,我认为使用 |(或)会在 CRLF(回车换行)行尾产生空结果。 - Dusty
现代网络中不会出现 CR-only (\r) line breaks。它们最后被广泛使用的地方是在将近20年前的古老的Mac OS版本中。 - Ilmari Karonen

14

只需要使用下面这行代码:

var ks = $('#keywords').val().split(/\r\n|\n|\r/);

就可以完美地工作了。

请确保RegExp字符串的开头放置\r\n,因为它将首先尝试匹配。


正则表达式末尾的 g 不是必需的。 - Yetti99

11

无论格式如何(CR+LF,LF+CR或LF),使用最简单和最安全的方式拆分字符串是删除所有回车符,然后根据换行符进行拆分"text".replace(/\r/g, "").split(/\n/);

这可以确保当您有连续的换行符时(例如\r\n\r\n\n\r\n\r\n\n)结果始终相同。

在您的情况下,代码将如下所示:

(function ($) {
    $(document).ready(function () {
        $('#data').submit(function (e) {
            var ks = $('#keywords').val().replace(/\r/g, "").split(/\n/);
            e.preventDefault();
            alert(ks[0]);
            $.each(ks, function (k) {
                alert(k);
            });
        });
    });
})(jQuery);

以下是一些示例,展示了该方法的重要性:

var examples = ["Foo\r\nBar", "Foo\r\n\r\nBar", "Foo\n\r\n\rBar", "Foo\nBar\nFooBar"];

examples.forEach(function(example) {
  output(`Example "${example}":`);
  output(`Split using "\n": "${example.split("\n")}"`);
  output(`Split using /\r?\n/: "${example.split(/\r?\n/)}"`);
  output(`Split using /\r\n|\n|\r/: "${example.split(/\r\n|\n|\r/)}"`);
  output(`Current method: ${example.replace(/\r/g, "").split("\n")}`);
  output("________");
});

function output(txt) {
  console.log(txt.replace(/\n/g, "\\n").replace(/\r/g, "\\r"));
}


3
  1. var ks = $('#keywords').val().split("\n");移至事件处理程序内部。
  2. 使用alert(ks[k])替换alert(k)
  (function($){
     $(document).ready(function(){
        $('#data').submit(function(e){
           e.preventDefault();
           var ks = $('#keywords').val().split("\n");
           alert(ks[0]);
           $.each(ks, function(k){
              alert(ks[k]);
           });
        });
     });
  })(jQuery);

Demo


1

好老的 JavaScript:

 var m = "Hello World";  
 var k = m.split(' ');  // I have used space, you can use any thing.
 for(i=0;i<k.length;i++)  
    alert(k[i]);  

0
问题在于当您初始化ks时,value尚未设置。
当用户提交表单时,您需要获取value。因此,您需要在回调函数内部初始化ks
(function($){
   $(document).ready(function(){
      $('#data').submit(function(e){
      //Here it will fetch the value of #keywords
         var ks = $('#keywords').val().split("\n");
         ...
      });
   });
})(jQuery);

0
这是一个示例,使用console.log而不是alert()。 这更方便 :)
var parse = function(){
  var str = $('textarea').val();
  var results = str.split("\n");
  $.each(results, function(index, element){
    console.log(element);
  });
};

$(function(){
  $('button').on('click', parse);
});

你可以在这里尝试一下


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