Javascript 正则表达式匹配所有字符直到下一次匹配
我正在解析一个简单模式的多次重复的文本。文本采用剧本的格式,如下所示:Javascript 正则表达式匹配所有字符直到下一次匹配,javascript,regex,parsing,Javascript,Regex,Parsing,我正在解析一个简单模式的多次重复的文本。文本采用剧本的格式,如下所示: 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},除了角色的语音中有换行符外,该模式工作正常(解释如下)。当这种情况发生时,角色的名字被成功捕获,但只捕
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),因此名称必须可用于下一个匹配项
理想情况下,我可以匹配所有字符,直到整个模式重复。
解释的模式: 第一个组匹配字符的名称(允许大写字母、数字和空格),(可选尾随冒号和空格)。
第二组(角色的演讲)从新行开始并捕获任何角色(有问题的是,断行和其后的字符除外)。
模式在一个空行后结束(并重新开始)。好的,我做了一些修补,发现了一些有效的方法。它不是超优雅的,但它可以做到
([A-Z0-9\s]+)\s*\:?\s*[\r\n]((.+[\r\n]?.*)+)[\r\n]{2}
我修改了最后一个捕获组,允许无休止地重复任意文本、新行和更多任意文本。由于一行中不允许有两个换行符,因此模式将在演讲后结束。请考虑使用此选项的不同方向。您确实希望在任何包含名称的行上拆分较大的对话。您仍然可以使用正则表达式来执行此操作(将正则表达式替换为与“speaker”行匹配的任何正则表达式): 在符合标准的实现中,示例文本将以如下方式结束:
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. "
需要注意的是,大多数浏览器在这里的标准上是参差不齐的。您可以使用该库来获取跨平台行为。我终于设法让它只匹配您想要的,即
-字符的名称,允许空格和冒号
-以及与此人关联的文本(可选多行加换行符) 您需要使用此正则表达式执行
findAll
,它区分大小写:
((?:[A-Z]{2,}\s*:?\s*)+)\s+((?![A-Z]{2,}\s*:?\s*).+?[.?!]\s*)+
说明:
-第一组捕获此人的大写姓名-它将匹配“GREGOR”和“MANFRED the Grest:”(((?:[A-Z]{2,}\s*:?\s*)+)
-至少有一个空白字符\s+
然后至少重复一次:
-向前看,检查下一个文本是否不是大写字符名(?![A-Z]{2,}\s*:?\s*)
-匹配所有内容,直到找到一个以句子结尾的字符+?[.?!]\s*
和可选的空格[.?!]
((?:[A-Z]{2,}\s*:?\s*)+)\s+((?![A-Z]{2,}\s*:?\s*).+?[.?!]\s*)+