我正在解析由一个简单模式重复多次的文本。文本采用剧本格式,如下所示:
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}
,它工作正常(下面的解释),除非 Angular 色的语音中有换行符。发生这种情况时, Angular 色的名字会被成功捕获,但只会捕获语音的第一行。
打开单行模式(在 .
中包含换行符)只会创建一个巨大的匹配。
如何让 (.+)
在找到下一个字符名称时停止并结束匹配?
我正在逐个迭代每个匹配项 (JavaScript),因此该名称必须可用于下一个匹配项。
理想情况下,我能够匹配所有字符,直到整个模式被重复。
模式解释:
第一组匹配一个字符的名称(允许大写字母、数字和空格),(尾随冒号和空格可选)。
第二组( Angular 色的语音)从一个新行开始并捕获任何字符(除了有问题的换行符和它们之后的字符)。
该模式在空行后结束(并重新开始)。
最佳答案
考虑换个方向。你真的想在任何包含名字的行上拆分一个更大的对话。您仍然可以使用正则表达式来执行此操作(将正则表达式替换为与“speaker”行匹配的任何内容):
results = "Insert script here".split(/^([A-Z]+)$/)
在符合标准的实现中,您的示例文本将以数组形式结束,如下所示:
results[0] = ""
results[1] = "SAMPSON"
results[2] = "I mean, an we be in choler, we'll draw.
"
results[3] = "GREGORY"
results[4] = "Ay, while you live, draw your neck out o' the collar. "
需要注意的是,大多数浏览器在此处的标准上参差不齐。您可以使用图书馆 XRegExp获得跨平台行为。
关于javascript - 匹配所有字符直到下一次匹配的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10369341/