REGEX用引号

时间:2015-06-25 09:48:42

标签: javascript regex match

我无法整理正则表达式以匹配引号和句子。以下是我想要满足的(简化)规范:

  • 句子是一串字符,后跟一个标点符号(一个点,为了简单起见)或换行符。

  • 引用是两个"之间的一串字符。

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

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

到目前为止,我已经提出了这个问题:\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.

我无法弄清楚出了什么问题,非常感谢任何帮助。

编辑:DESIRED OUTPUT

2 个答案:

答案 0 :(得分:2)

REGEX101

((?![.\n\s])[^.\n"]*(?:"[^\n"]*[^\n".]"[^.\n"]*)*(?:"[^"\n]+\."|\.|(?=\n)))

拆分:

  • (?![.\n\s]) - 首先检查我们是从一个有效字符开始的(不是空格或句子的结尾。
  • [^.\n"]* - 然后匹配任何未包含在句号中的文本,这些文本不包含句子终结符。
  • (?:"[^\n"]*[^\n".]"[^.\n"]*) - 然后匹配(在非捕获组中)包含至少一个字符并且不包含换行符的引用,并且不使用句子终止符结束引号 -​​ 后跟零或 - 更多不在引用中且不包含句子终结符的字符。
  • * - 之前的非捕获组可以重复为零(因此可以存在没有引号的句子) - 或者更多次。
  • (?:"[^"\n]+\."|\.|(?=\n)) - 最后,包括以句号结尾的句号或句子末尾的句号,或者检查我们是否以换行符结尾。

答案 1 :(得分:0)

使用简单的正则表达式,您想要做的事情是非常难以实现的。编写解析器会更好,因为在给定的情况下这会更容易。

您需要做的是:

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

这可以给你你想要的东西。