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*)+
说明:

  • (((?:[A-Z]{2,}\s*:?\s*)+)
    -第一组捕获此人的大写姓名-它将匹配“GREGOR”和“MANFRED the Grest:”
  • \s+
    -至少有一个空白字符
    然后至少重复一次:
  • (?![A-Z]{2,}\s*:?\s*)
    -向前看,检查下一个文本是否不是大写字符名
  • +?[.?!]\s*
    -匹配所有内容,直到找到一个以句子结尾的字符
    [.?!]
    和可选的空格

您需要明确定义如何确定下一个名称的起始位置,然后才能编写与之匹配的正则表达式。它是一个单独的单词,在一行上后跟冒号吗?这会导致任何不正确的匹配吗?@mellamokb我忘了包括模式的最后一部分,它寻找一个空行。比赛开始于角色的名字(在它自己的行上的所有帽子),在演讲结束后在空白行结束。我相信你在样本文本中缺少冒号,正则表达式不适用于它。@冒号应该是可选的;如果缺少正则表达式,它应该仍然有效。换行符是最重要的部分。不管它应该做什么,你的示例都不能与你的正则表达式一起工作,这对我们没有多大帮助。除了冒号之外,您的正则表达式似乎需要在末尾添加2个换行符,这在示例中也没有反映出来。我只是想指出,我将您的问题中的正则表达式和示例粘贴到了简单启用的dotall模式(点匹配换行符)中,从而解决了您的问题。奇怪的是,在我的用例中,将对话框拆分为单独的行是没有意义的。由于程序(和用户)与对话框作为一个整体进行交互,我只需将它们再次缝合在一起,这样它们就会很有用。
((?:[A-Z]{2,}\s*:?\s*)+)\s+((?![A-Z]{2,}\s*:?\s*).+?[.?!]\s*)+