我想从日期中解析dd/mm/yy
格式中间的两位数,但也允许日和月的一位数。
这是我想出的:
(?<=^[\d]{1,2}\/)[\d]{1,2}
我想要一个1或2位数字[\d]{1,2}
以及1或2位数字,并^[\d]{1,2}\/
在其前加斜杠。
这并不对许多组合工作,我已经测试10/10/10
,11/12/13
等…
但令我惊讶的(?<=^\d\d\/)[\d]{1,2}
是。
但是[\d]{1,2}
如果\d\d
这样做也应该匹配,否则我错了吗?
正则表达式的主要口味对后视的支持不同。有些施加了一定的限制,有些甚至根本不支持它。
在仅支持固定长度的向后查找的Python中,您的原始模式会引发错误,因为\d{1,2}
显然没有固定长度。您可以通过交替使用两个不同的固定长度的lookbehind来“修复”此问题,例如:
(?<=^\d\/)\d{1,2}|(?<=^\d\d\/)\d{1,2}
或者,您也可以将两个后置项作为一个非捕获组的备用项:
(?:(?<=^\d\/)|(?<=^\d\d\/))\d{1,2}
(请注意,\d
无需括号即可使用)。
也就是说,使用捕获组可能要简单得多:
^\d{1,2}\/(\d{1,2})
请注意,findall
如果只有一个组,则返回第1组捕获的内容。捕获组比后面的支持更广泛,并且通常导致更易读的模式(例如在这种情况下)。
此片段说明了以上所有要点:
p = re.compile(r'(?:(?<=^\d\/)|(?<=^\d\d\/))\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")
Java仅支持有限长度的后向查找,因此您可以\d{1,2}
像在原始模式中那样使用。以下代码段演示了这一点:
String text =
"12/34/56 date\n" +
"1/23/45 another date\n";
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/45
12/34/56
123/45/67
1234/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 = 23
Matched [12/34]; month = 34
Matched [123/45]; month = 45
Matched [1234/56]; month = 56
问题内容: alert(myVar1); return false; var myVar1; 上面的代码在IE,FF和Opera中引发错误,表明return语句必须包含在函数中。但它可以在Safari和Chrome中运行(显示)。 以上代码已在全局范围内编写。以外的所有功能。 任何原因? 问题答案: 在javaScript中,将变量移到脚本顶部,然后运行。所以当你运行它会做 这是因为javascr
跟进这个问题 我也尝试过,但是它没有noargs构造函数(你现在可以用服务/控制器/组件来实现,为什么它在这里不工作呢?) 然而这是可行的。 为什么不像其他Spring托管类那样工作?
问题内容: 我有一个嵌套的flexbox布局(使用bootstrapv4),可根据横向/纵向模式更改方向。第一层(由flexbox使用该属性放置)包含5个用作按钮的图标。我无法在这些图标上正常使用该属性。 如果我不使用属性,则图标将按照自然顺序进行布局;但是,如果我尝试使用该属性对其进行布局,则无法正常工作。在代码中,()应该是最后一个元素。不是。我可以通过更改源中的顺序来获得所需的顺序。但是,我
问题内容: 我有一个来自客户的错误,当我查看日志时,我们跟踪异常,某些堆栈跟踪没有行号: 请注意:我已将包名称替换为“ xx”),并且所有类和方法均在我们的应用程序中定义: 完整的堆栈跟踪如下: 我对为什么会发生这样的事情很感兴趣,我的客户是否有可能对现有代码(自定义)进行某些处理? 问题答案: 不显示行号的代码是在没有调试信息的情况下编译的。
我使用p{Digit}来验证字符串。然而,当我使用"101 1"的结果是真的。这发生在一些符号上:, 我没有找到在留档中验证的字符。
我有一个非常简单的JSF 2/Facelets页面,如下所示: 支持bean提供了一个 消息。因此,在