[英]How do I use javascript regex to separate this text into groups such that each group has one set of instructions and the item(s) below it?
我有一段文字(不带引号):
INSTRUCTIONS: Instructions 1
1. Item 1
2. Item 2
INSTRUCTIONS: Instructions 2
3. Item 3
如何使用javascript正则表达式将此文本分成几组,以便每组都有一组说明及其下面的项目?
输出应为:
groups[0] = "INSTRUCTIONS: Instructions 1
1. Item 1
2. Item 2
groups[1] = "INSTRUCTIONS: Instructions 2
3. Item 3
我是一个初学者,但是我想到了: (?:^|\\s)(INSTRUCTIONS:(?:.|[\\s])*)+(?:$|\\s)
,这显然不是工作。 它产生两个组,每个组中都有整个文本块。
谢谢!
Daniel Knippers的回答可能是正确的,但是需要一些解释。
在正则表达式结果数组中,第一个元素groups[0]
是与整个正则表达式匹配的子字符串,而不是捕获组。 实际的捕获组从[1]
开始。 在您的正则表达式中,只有一个捕获组。
我猜您在编译时不知道INSTRUCTIONS:
在字符串中会出现多少次。 这意味着仅捕获组是不够的,因为您必须在编译时决定要在正则表达式中包含多少个捕获组。 子表达式(INSTRUCTIONS:(?:.|[\\s])*)+
仅包含一个捕获组; 如果匹配不止一次,则仅保留最后一个匹配。 因此,您需要一个仅与字符串的一部分匹配但以/g
结尾的正则表达式,以便您可以多次运行它。
正则表达式的另一个问题是,它与预期的每个部分都不匹配; 而是一次匹配整个字符串,并使用第二个INSTRUCTIONS:
匹配(?:.|[\\s])*
子表达式的一部分的字符串。 Daniel使用(?=INSTRUCTIONS|$)
表达式解决了这个问题,该表达式可以在字符串的末尾或在下一个INSTRUCTIONS
之前匹配。 使用(?=...)
允许比赛在INSTRUCTIONS
之前结束的想法本身并不能解决问题。 您还需要说明,在所有有效的匹配中,最短的匹配是我们想要的匹配。 这就是为什么他使用“惰性”匹配(.|\\n)+?
,而不是“贪婪”匹配(.|\\n)+
。
这可行。
var str = "INSTRUCTIONS: Instructions 1\n" +
"1. Item 1\n" +
"2. Item 2\n" +
"INSTRUCTIONS: Instructions 2\n" +
"3. Item 3"
var groups = str.match(/INSTRUCTIONS:((.|\n)+?)(?=INSTRUCTIONS|$)/g)
// ["INSTRUCTIONS: Instructions 1
// 1. Item 1
// 2. Item 2
// ", "INSTRUCTIONS: Instructions 2
// 3. Item 3"]
您可以使用String.prototype.split()
并搜索INSTRUCTIONS
(区分大小写)一词( ?=
)之前的换行( \\r?\\n
)。
注意:可选的\\r
用于检查回车。
str.split(/\r?\n(?=INSTRUCTIONS)/)
// ["INSTRUCTIONS: Instructions 1
// 1. Item 1
// 2. Item 2", "INSTRUCTIONS: Instructions 2
// 3. Item 3"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.