除了面对两条或更多条新线外,捕获所有内容的最佳方法是什么?
例如:
name1
address1
zipcode
name2
address2
zipcode
name3
address3
zipcode
我考虑的一个正则表达式是/[^\n\n]*\s*/g
。但是当它面对一个\n
字符时会停止。
我考虑的另一种方式是/((?:.*(?=\n\n)))\s*/g
。但这似乎只捕获了忽略前一行的最后一行。
处理类似情况的最佳方法是什么?
答案 0 :(得分:1)
((.+)\n?)*
(您可能希望将这些组设为非捕获,将其保留为可读性)
内部部分(.+)\n?
表示“非空行”(至少一个非换行字符为。与新行不匹配,除非设置了相应的标志,后跟可选的换行符)
然后,重复任意次数(匹配整个非空行块)。
但是,根据你正在做的事情,regexp可能不是你想要的答案。你确定只是按\n\n
拆分字符串就不会做你想要的吗?
答案 1 :(得分:1)
你有使用正则表达式吗?没有它,解决方案很简单。
var data = 'name1...';
var matches = data.split('\n\n');
要访问单个子部分,请再次按\n
拆分。
//the first section's name
var name = matches[0].split('\n')[0];
答案 2 :(得分:1)
<强>更新强>
您可以考虑将可变长度分隔符替换为已处理文本中未出现的已知固定长度字符串然后拆分。例如:
> var s = "Hi\n\n\nBye\nCiao";
> var x = s.replace(/\n{2,}/, "#");
> x.split("#");
["Hi", "Bye
Ciao"]
我认为这是一个优雅的解决方案。您还可以使用以下有点人为的正则表达式
> s.match(/((?!\n{2,})[\s\S])+/g);
["Hi", "
Bye
Ciao"]
然后通过将trim()
字符串方法应用于其成员来处理结果数组,以便除去数组中每个字符串的开头/结尾处的任何\n
。