正则表达式问题 - 取消捕获的角色

Sea*_*lan 1 regex perl

我正在寻找一个允许单引号或双引号字符串的正则表达式,并允许字符串中的相反引号字符.例如,以下两者都是合法的字符串:"你好'那里'世界'"你好"那里"世界"

我正在使用的正则表达式使用负向前瞻,如下所示:

(['"])(?:(?!\1).)*\1
Run Code Online (Sandbox Code Playgroud)

我认为这会起作用,但如果语言不支持负面前瞻怎么办呢.有没有其他方法可以做到这一点?没有交替?

编辑:

我知道我可以使用轮换.这更像是一个假设的问题.假设我在初始角色类中有20个不同的角色.我不想写出20种不同的变化.我试图实际上否定捕获的角色,而不使用前瞻,后视或交替.

mat*_*mc3 7

这实际上比你可能已经意识到的要简单得多.你真的不需要负面的预测.你想要做的是像这样的非贪婪(或懒惰)匹配:

(['"]).*?\1
Run Code Online (Sandbox Code Playgroud)

?之后的字符.*是重要的组成部分.它说,在击中正则表达式的下一部分之前消耗尽可能少的字符.所以,你得到任何一种引用,然后你去追寻0-M字符,直到你遇到一个匹配你最初遇到的引用的字符.您可以在此处此处了解有关贪婪匹配与非贪婪的更多信息.

  • @Peter Ajtai,不,不能; 字符类中不允许反向引用.那个班级给你任何角色但是\ 001 aka chr(1). (2认同)