我无法整理正则表达式以匹配引号和句子。以下是我想要满足的(简化)规范:
句子是一串字符,后跟一个标点符号(一个点,为了简单起见)或换行符。
引用是两个"
之间的一串字符。
每个句子应该是一个新的匹配。
句子可以包含引号,引号可以包含句子。只有报价中的最后一句应该结束捕获。
到目前为止,我已经提出了这个问题:\s*((?:("[^"]*")|[^.\n])*\.+"?)\s*
测试用例:REGEX101
正如您所看到的,我无法正确地将引语与句子分开。例如:
§2:"Your lordship," Mya informed Lord Robert, "Lady Waynwood’s banners have been seen an hour down the road. She will be here soon, with your cousin Harry. Will you want to greet them"
应该是一个完整的匹配,但正则表达式给了我三个并捕获下一段。
§3:"They were invited," she said uncertainly, "for the tourney. I don’t..."
应该作为完整匹配停止,但正则表达式继续捕获Alayne closed her book.
我无法弄清楚出了什么问题,非常感谢任何帮助。
答案 0 :(得分:2)
((?![.\n\s])[^.\n"]*(?:"[^\n"]*[^\n".]"[^.\n"]*)*(?:"[^"\n]+\."|\.|(?=\n)))
拆分:
(?![.\n\s])
- 首先检查我们是从一个有效字符开始的(不是空格或句子的结尾。[^.\n"]*
- 然后匹配任何未包含在句号中的文本,这些文本不包含句子终结符。(?:"[^\n"]*[^\n".]"[^.\n"]*)
- 然后匹配(在非捕获组中)包含至少一个字符并且不包含换行符的引用,并且不使用句子终止符结束引号 - 后跟零或 - 更多不在引用中且不包含句子终结符的字符。*
- 之前的非捕获组可以重复为零(因此可以存在没有引号的句子) - 或者更多次。(?:"[^"\n]+\."|\.|(?=\n))
- 最后,包括以句号结尾的句号或句子末尾的句号,或者检查我们是否以换行符结尾。答案 1 :(得分:0)
使用简单的正则表达式,您想要做的事情是非常难以实现的。编写解析器会更好,因为在给定的情况下这会更容易。
您需要做的是:
这可以给你你想要的东西。