落后支持
正则表达式的主要口味对后视的支持不同。有些施加了一定的限制,有些甚至根本不支持它。
- Javascript:不支持
- Python:仅固定长度
- Java:仅有限长度
- .NET:无限制
参考文献
- Regular-expressions.info/比较
蟒蛇
在仅支持固定长度的向后查找的Python中,您的原始模式会引发错误,因为
d{1,2}显然没有固定长度。您可以通过交替使用两个不同的固定长度的lookbehind来“修复”此问题,例如:(?<=^d/)d{1,2}|(?<=^dd/)d{1,2}或者,您也可以将两个后置项作为一个非捕获组的备用项:
(?:(?<=^d/)|(?<=^dd/))d{1,2}(请注意,
d无需括号即可使用)。
也就是说,使用捕获组可能要简单得多:
^d{1,2}/(d{1,2})请注意,
findall如果只有一个组,则返回第1组捕获的内容。捕获组比后面的支持更广泛,并且通常导致更易读的模式(例如在这种情况下)。
此片段说明了以上所有要点:
p = re.compile(r'(?:(?<=^d/)|(?<=^dd/))d{1,2}')print(p.findall("12/34/56")) # "[34]"print(p.findall("1/23/45")) # "[23]"p = re.compile(r'^d{1,2}/(d{1,2})')print(p.findall("12/34/56")) # "[34]"print(p.findall("1/23/45")) # "[23]"p = re.compile(r'(?<=^d{1,2}/)d{1,2}')# raise error("look-behind requires fixed-width pattern")参考文献
- Regular-expressions.info/环顾四周,字符类,交替,捕获组
爪哇
Java仅支持有限长度的后向查找,因此您可以
d{1,2}像在原始模式中那样使用。以下代码段演示了这一点: String text = "12/34/56 daten" + "1/23/45 another daten"; Pattern p = Pattern.compile("(?m)(?<=^\d{1,2}/)\d{1,2}"); Matcher m = p.matcher(text); while (m.find()) { System.out.println(m.group()); } // "34", "23"请注意,它
(?m)是嵌入式的,
Pattern.MULTILINE因此
^与每行的开头匹配。还要注意,由于是字符串文字的转义字符,因此必须编写
"\"以在Java中获得一个反斜杠。
尖锐的
C#在lookbehind上支持完整的正则表达式。以下代码段显示了如何在后视中使用
+重复:
var text = @"1/23/4512/34/56123/45/671234/56/78";Regex r = new Regex(@"(?m)(?<=^d+/)d{1,2}");foreach (Match m in r.Matches(text)) { Console.WriteLine(m);} // "23", "34", "45", "56"请注意,与Java不同,在C#中,您可以使用@引号引起来的字符串,这样就不必转义
。为了完整起见,这是在C#中使用捕获组选项的方式:
Regex r = new Regex(@"(?m)^d+/(d{1,2})");foreach (Match m in r.Matches(text)) { Console.WriteLine("Matched [" + m + "]; month = " + m.Groups[1]);}给定上一个
text,将输出:
Matched [1/23]; month = 23Matched [12/34]; month = 34Matched [123/45]; month = 45Matched [1234/56]; month = 56



