这是一系列教育正则表达式文章的第二部分.它显示了向前看符号和嵌套引用如何可以用来匹配非正规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说我有一个字符串:
teststring = "1.3 Hello how are you 1.4 I am fine, thanks 1.2 Hi There 1.5 Great!"
Run Code Online (Sandbox Code Playgroud)
我希望如下:
testlist = ["1.3 Hello how are you", "1.4 I am fine, thanks 1.2 Hi There", "1.5 Great!"]
Run Code Online (Sandbox Code Playgroud)
基本上,仅在增加的数字上进行分割,其中差值为.1(即1.2到1.3).
有没有办法用正则表达式分割它,但只捕获增加的序号?我在python中编写代码,以便为每个代码重复使用自定义re.compile()并且它很好但是非常笨拙.
像这样的东西(其中parts1_temp是字符串中xx数字的给定列表):
parts1_temp = ['1.3','1.4','1.2','1.5']
parts_num = range(int(parts1_temp.split('.')[1]), int(parts1_temp.split('.')[1])+30)
parts_search = ['.'.join([parts1_temp.split('.')[0], str(parts_num_el)]) for parts_num_el in parts_num]
#parts_search should be ['1.3','1.4','1.5',...,'1.32']
for k in range(len(parts_search)-1):
rxtemp = re.compile(r"(?:"+str(parts_search[k])+")([\s\S]*?)(?=(?:"+str(parts_search[k+1])+"))", re.MULTILINE)
parts_fin = [match.group(0) for match in rxtemp.finditer(teststring)]
Run Code Online (Sandbox Code Playgroud)
但是男人是丑陋的.有没有办法在正则表达式中更直接地执行此操作?我想这是有人在某些方面想要正则表达式的功能,但我找不到任何关于如何解决这个问题的想法(也许纯正的正则表达式是不可能的).