正则表达式匹配n引号字符串

3

使用转义序列匹配字符串非常容易:

"(\\.|[^"])*"

但是如果我想支持不仅仅是Python的三引号字符串 ("""hello"""),而是支持任意数量引号的字符串,只要开头和结尾匹配呢?

("+)(.*?)\1

我会这样做,但是我会失去对转义序列的支持,例如 "hello\"world" 应该完全匹配。

其他应完全匹配的示例:

  • """hello world""""" (字符串以两个引号结尾)
  • ""hello\""world""(中间有两个引号,但其中一个被转义,而另一个不足以单独结束字符串)

使用正则表达式是否可能实现这一点?


你想在这个"hello\"world"字符串中匹配hello\"world吗?你想在这个""hello\""world""字符串中匹配哪一部分? - Avinash Raj
@AvinashRaj 整个东西,包括引号。如果需要,我可以稍后添加更多捕获组。 - mpen
2个回答

1
这个怎么样?
^("+)((.*?)(?<!\\)(?:\\\\)*)\1$

我之前有一个更简单的表达式,但在处理"hello world \\"时失败了,所以我更新了一下使用回顾后瞻来允许在闭合引号之前存在偶数个反斜杠,但不允许有奇数个反斜杠。使用的正则表达式语法是PCRE。

这里链接到示例。


哦,太接近了,但你使用了^$锚点作弊。如果你去掉它们,那么它会将"""hello world"""""匹配为两个单独的字符串而不是一个。应该要贪婪一些...我想。这样更有意义,对吧? - mpen
@Mark 如果你不需要从一段文本中解析出多个这样的实例,贪婪模式应该没问题。否则,祝那些尝试提出非贪婪变体的人好运 :-) - Robby Cornelissen
它将进入解析器。开头是固定的,但结尾不是。这很糟糕。我会再考虑一下,但可能不得不放弃这个功能;只是觉得这很有趣。 - mpen

0

不应该匹配"hello world\" -- 结尾的引号被转义了。 - mpen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接