我在组合正则表达式来匹配引号和句子时遇到困难。以下是我试图满足的(简化的)规范:
句子是一串字符,后跟标点符号(一个点,为了简单起见)或换行符。
引号是两个
"
之间的字符链。每个句子都应该是一个新的匹配。
句子可以包含引号,引号也可以包含句子。只有引用中的最后一句话才能结束捕获。
到目前为止,我已经想出了这个: \s*((?:("[^"]*")|[^.\n])*\.+"?)\s*
测试用例:REGEX101
如您所见,我无法正确地将引号与句子分开。例如:
§2:“阁下,”米亚告诉罗伯特勋爵,“一小时后就看到了韦恩伍德夫人的旗帜。她很快就会和你的表弟哈利一起到达这里。你想向他们打招呼吗?”
应该是一个完整的匹配,但正则表达式给了我三个并捕获下一段。
§3: “他们被邀请参加比赛,”她不确定地说,“我不...”
应该作为完整的比赛停止,但正则表达式继续捕获阿莲合上书。
我不知道出了什么问题,非常感谢任何帮助。
最佳答案
((?![.\n\s])[^.\n"]*(?:"[^\n"]*[^\n".]"[^.\n"]*)*(?:"[^"\n]+\."|\.|(?=\n)))
拆分:
(?![.\n\s])
- 首先检查我们是否以有效字符开头(不是空格或句子结尾。[^.\n"]*
- 然后匹配任何未用引号引起来且不包含句子终止符的文本。(?:"[^\n"]*[^\n".]"[^.\n"]*)
- 然后匹配(在非捕获组中)a至少包含一个字符且不包含换行符且不以句子终止符结束引用的引用 - 后跟零个或多个不在引用中且不包含句子终止符的字符。*
- 前一个非捕获组可以重复零次(以便可以有不带引号的句子)或多次。(?:"[^"\n]+\."|\.|(?=\n))
- 最后,包含以句号结尾的引号或句子末尾的句号或检查是否以换行符结尾。
关于javascript - REGEX 用于捕获带引号的句子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31046831/