Javascript 正则表达式捕获带有引号的句子

Javascript 正则表达式捕获带有引号的句子,javascript,regex,match,Javascript,Regex,Match,我在整理正则表达式以匹配引号和句子时遇到困难。以下是我尝试满足的(简化)规格: 一个句子是一连串的字符,后面跟着一个标点符号(一个点,以保持简单)或换行符 引号是两个“之间的字符链 每个句子都应该是新的匹配 句子可以包含引号,引号可以包含句子。只有引号中的最后一句才应结束捕获 到目前为止,我已经提出了这个:\s*((?:(“[^”]*”)\124;[^.\ n])*\。+“?)\s* 测试用例: 正如你所见,我无法正确地将引号与句子分开。例如: §2:“大人,”迈亚告诉罗伯特勋爵,“一个小时

我在整理正则表达式以匹配引号和句子时遇到困难。以下是我尝试满足的(简化)规格:

  • 一个句子是一连串的字符,后面跟着一个标点符号(一个点,以保持简单)或换行符

  • 引号是两个
    之间的字符链

  • 每个句子都应该是新的匹配

  • 句子可以包含引号,引号可以包含句子。只有引号中的最后一句才应结束捕获

到目前为止,我已经提出了这个:
\s*((?:(“[^”]*”)\124;[^.\ n])*\。+“?)\s*

测试用例:

正如你所见,我无法正确地将引号与句子分开。例如:

§2:
“大人,”迈亚告诉罗伯特勋爵,“一个小时后,人们看到了韦恩伍德夫人的旗帜。她很快就会来的,还有你表妹哈里。你想和他们打招呼吗?
应该是完全匹配的,但是正则表达式给了我三个,并捕获了下一段

§3:
“他们被邀请参加锦标赛,”她不确定地说。我不…“
应该作为完全匹配停止,但正则表达式继续捕获
Alayne合上她的书。

我不知道出了什么问题,任何帮助都将不胜感激


编辑:

对于一个简单的正则表达式,您想要做的事情是非常困难的,甚至是不可能的。最好编写一个解析器,因为在给定的情况下,这会容易得多

您需要做的是:

  • 您需要两种模式:“引号内”或“引号外”
  • 以“引号外”开头
  • 如果遇到引号,请在模式之间切换
  • 如果在“引号外”模式中遇到标点符号,请在此处中断匹配并开始新的匹配
  • 如果在“引号内”-模式中遇到标点符号,请检查下一个字符是否为引号。如果是,请在此处中断匹配,开始新的匹配,并将模式设置为“引号外”
这会给你想要的。

拆分:

  • (?![。\n\s])
    -首先检查是否以有效字符开头(而不是空格或句子结尾)
  • [^.\n”]*
    -然后匹配任何未用引号括起且不包含句子结束符的文本
  • (?:“[^\n”]*[^\n.”“[^.\n”]*)
    -然后匹配(在非捕获组中)至少包含一个字符且不包含换行符且不以句子结束符结尾的引号-后跟不在引号中且不包含句子结束符的零个或多个字符
  • *
    -上一个非捕获组可以重复0次(这样就可以有不带引号的句子)或更多次
  • (?:“[^”\n]+\.“|\.|(?=\n))
    -最后,在句子末尾添加以句号结尾的引号或句号,或者检查我们是否以换行结束

您已将正则表达式编程为检测单点结束,因此“他们被邀请参加比赛,”她不确定地说,“我没有……”Alayne合上了书。这是一个完整的句子,它是正确的。你的正则表达式正在发挥作用。你的例子§2不是一个完整的匹配,而是根据你要求的规则的三个。因为“road”和“Harry”后面有puncuation标记。
\+
不是指“一个点,在一次和无限次之间”?@Arathisrekumar我的第四条规则是:包含多个引号的句子应该是唯一的匹配。如果不清楚,很抱歉。是的,但你的词组不在引号内。这意味着,你的句子以标点符号结尾,不包含多个引号。谢谢你的尝试,但你遇到的问题与我相同,你的正则表达式给出了答案《代码》的一场比赛“他们被邀请了,”她不确定地说,“参加锦标赛。我不……”阿莱恩合上了书。但应该是2。
((?![.\n\s])[^.\n"]*(?:"[^\n"]*[^\n".]"[^.\n"]*)*(?:"[^"\n]+\."|\.|(?=\n)))