【发布时间】:2012-05-09 07:20:47
【问题描述】:
我正在解析一个简单模式的多次重复文本。文本采用剧本的格式,如下所示:
SAMPSON
I mean, an we be in choler, we'll draw.
GREGORY
Ay, while you live, draw your neck out o' the collar.
我目前正在使用模式([A-Z0-9\s]+)\s*\:?\s*[\r\n](.+)[\r\n]{2},它可以正常工作(下面的解释),除非角色的语音中有换行符。发生这种情况时,角色的名字被成功捕获,但只捕获语音的第一行。
打开单行模式(在. 中包含换行符)只会创建一个巨大的匹配项。
如何告诉(.+) 在找到下一个字符名称并结束匹配时停止?
我正在单独迭代每个匹配项(JavaScript),因此该名称必须可用于下一个匹配项。
理想情况下,我可以匹配所有字符,直到整个模式重复。
模式解释:
第一组匹配字符的名称(允许大写字母、数字和空格),(尾随冒号和空格可选)。
第二组(角色的讲话)从新的一行开始并捕获任何字符(有问题的是,换行符和它们之后的字符除外)。
模式在空行之后结束(并重新开始)。
【问题讨论】:
-
您需要明确定义如何确定下一个名称的开始位置,然后才能编写正则表达式来匹配它。它是一个单独的单词,后跟冒号吗?这会导致任何不正确的匹配吗?
-
@mellamokb 我忘了包含模式的最后一部分,它会寻找一个空行。匹配从角色的名字开始(所有大写在自己的一行),并在演讲后的空白行结束。
-
我相信您的示例文本中缺少冒号,正则表达式无法使用它。
-
@TheronLuhn 冒号应该是可选的;如果它丢失,正则表达式应该仍然有效。换行符是重要的部分。
-
无论它应该做什么,您的样本都不能与您的正则表达式一起使用,这对我们没有多大帮助。除了冒号,您的正则表达式最后似乎需要 2 个换行符,这也没有反映在示例中。
标签: javascript regex parsing