这是一系列教育正则表达式文章的第二部分.它显示了向前看符号和嵌套引用如何可以用来匹配非正规languge ñ b ñ.嵌套引用首先介绍在:这个正则表达式如何找到三角形数字?
其中一种原型非常规语言是:
L = { a
ñb
ñ: n > 0 }
这是所有非空字符串的语言,由一些数字a
后跟相同数量的字符串组成b
.在这个语言字符串的例子有ab
,aabb
,aaabbb
.
这种语言可以通过泵浦引理显示为非规则的.它实际上是一种原型上下文无关语言,可以通过无上下文语法 生成S ? aSb | ab
.
尽管如此,现代正则表达式实现清楚地认识到的不仅仅是常规语言.也就是说,它们不是形式语言理论定义的"规则".PCRE和Perl支持递归正则表达式,.NET支持平衡组定义.更少的"花哨"特征,例如反向引用匹配,意味着正则表达式不规则.
但这个"基本"功能有多强大?L
例如,我们可以用Java正则表达式识别吗?我们也许可以结合lookarounds和嵌套引用,并具有与如工作模式String.matches
来匹配字符串一样ab
,aabb
,aaabbb
,等?
java.util.regex.Pattern
注意:这是关于现代正则表达口味的可能性的问题.这不是使用其他方法解决这个问题的最佳方法.它受到早期问题的启发,但不仅限于正则表达式.
在ASCII"图像"/ art/map/string中:
....X.......
..X..X...X....
X.X...X..X.....
X....XXXXXX.....
X..XXX...........
.....X..........
..............X
..X...........X....
..X...........X....X...
....X.....
Run Code Online (Sandbox Code Playgroud)
我想找到三个简单的垂直线形式X
:
X
X
X
Run Code Online (Sandbox Code Playgroud)
线条的数量在图像中是可变的,每条线条的宽度也是可变的.
使用正则表达式(PCRE/PHP,Perl,.NET或类似)可以:
您可以轻松使用正则表达式来验证常规语言.我的问题是你能用它来验证一个上下文敏感的语言吗?现代正则表达式在层次结构中有多强大?
您将如何创建一个正则表达式来检查与^ nb ^ nc ^ n匹配的字符串?
以下情况应符合:
abc
aabbcc
aaabbbccc
Run Code Online (Sandbox Code Playgroud)
以下情况不符合:
abbc
aabbc
aabbbccc
Run Code Online (Sandbox Code Playgroud) 首先,让我解释一下,这个问题既不是关于如何捕获组,也不是关于如何使用量词,这是我非常熟悉的正则表达式的两个特征.对于可能熟悉异国情调引擎中不寻常语法的正则表达式爱好者而言,这是一个更高级的问题.
捕捉量词
有谁知道正则表达式的味道是否允许你捕捉量词?通过这个,我的意思是计数与+和*等量词匹配的字符数将被计算,并且这个数字可以在另一个量词中再次使用.
例如,假设您要确保在此类字符串中具有相同数量的Ls和Rs:LLLRRRRR
你可以想象一下这样的语法
L(+)R{\q1}
Run Code Online (Sandbox Code Playgroud)
其中捕获了L的+量词,并且在R的量词中将捕获的数字称为{\ q1}
这对平衡{@,=, - ,/}在字符串中的数量很有用,例如@@@@"星球大战"===="1977"----"科幻小说"////"乔治卢卡斯"
与递归的关系
在某些情况下,量词捕获会优雅地替换递归,例如由相同数量的Ls和Rs构成的一段文本,a in
L(+) some_content R{\q1}
Run Code Online (Sandbox Code Playgroud)
这个想法在下面的页面中有一些细节:Captifured Quantifiers
它还讨论了捕获量化的自然扩展:量化算术,适用于您希望匹配(3*x + 1)之前匹配的字符数的情况.
我试图找出这样的事情是否存在.
在此先感谢您的见解!
更新
Casimir给出了一个很棒的答案,它显示了两种方法来验证模式的各个部分具有相同的长度.但是,我不想在日常工作中依赖其中任何一种.这些都是表现出色表演的伎俩.在我看来,这些美丽但复杂的方法证实了这个问题的前提:一个正则表达式特征来捕获量化的字符数(例如+或*)能够匹配将使这种平衡模式非常简单并扩展语法一种令人愉快的表达方式.
更新2(稍后)
我发现.NET有一个接近我所询问的功能.添加了演示该功能的答案.
regex ×4
.net ×1
c# ×1
java ×1
lookaround ×1
pcre ×1
perl ×1
php ×1
quantifiers ×1
recursion ×1