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))
\+
不是指“一个点,在一次和无限次之间”?@Arathisrekumar我的第四条规则是:包含多个引号的句子应该是唯一的匹配。如果不清楚,很抱歉。是的,但你的词组不在引号内。这意味着,你的句子以标点符号结尾,不包含多个引号。谢谢你的尝试,但你遇到的问题与我相同,你的正则表达式给出了答案《代码》的一场比赛“他们被邀请了,”她不确定地说,“参加锦标赛。我不……”阿莱恩合上了书。但应该是2。
((?![.\n\s])[^.\n"]*(?:"[^\n"]*[^\n".]"[^.\n"]*)*(?:"[^"\n]+\."|\.|(?=\n)))