繁体   English   中英

如何使用javascript正则表达式将此文本分成几组,以便每组都有一组说明及其下面的项目?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM