除了面对两条或更多条新线时,捕获所有内容的最佳方法是什么?
前任:
name1
address1
zipcode
name2
address2
zipcode
name3
address3
zipcode
我考虑的一个正则表达式是/[^\n\n]*\s*/g
. 但是当它面对一个单一的\n
角色时,这就停止了。
我考虑的另一种方式是/((?:.*(?=\n\n)))\s*/g
. 但这似乎只捕获了忽略前面几行的最后一行。
处理类似情况的最佳方法是什么?
除了面对两条或更多条新线时,捕获所有内容的最佳方法是什么?
前任:
name1
address1
zipcode
name2
address2
zipcode
name3
address3
zipcode
我考虑的一个正则表达式是/[^\n\n]*\s*/g
. 但是当它面对一个单一的\n
角色时,这就停止了。
我考虑的另一种方式是/((?:.*(?=\n\n)))\s*/g
. 但这似乎只捕获了忽略前面几行的最后一行。
处理类似情况的最佳方法是什么?
((.+)\n?)*
(您可能想让组不被捕获,为了可读性而保留它)
内部(.+)\n?
表示“非空行”(至少一个非换行符如 . 不匹配换行符,除非设置了适当的标志,然后是可选的换行符)
然后,重复任意次数(匹配整个非空行块)。
但是,根据您在做什么,regexp 可能不是您正在寻找的答案。你确定只是分割字符串\n\n
不会做你想要的吗?
你必须使用正则表达式吗?没有它,解决方案很简单。
var data = 'name1...';
var matches = data.split('\n\n');
要访问单个子部分,请\n
再次将其拆分。
//the first section's name
var name = matches[0].split('\n')[0];
更新
您可以考虑将可变长度分隔符替换为未出现在已处理文本中的已知固定长度字符串,然后拆分。例如:
> 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()
string 方法应用于其成员来处理结果数组,以消除\n
数组中每个字符串的开头/结尾处的任何内容。