当前位置: 首页 > 面试题库 >

为什么在后面的视图中进行有限重复在某些方面不能起作用?

松兴邦
2023-03-14
问题内容

我想从日期中解析dd/mm/yy格式中间的两位数,但也允许日和月的一位数。

这是我想出的:

(?<=^[\d]{1,2}\/)[\d]{1,2}

我想要一个1或2位数字[\d]{1,2}以及1或2位数字,并^[\d]{1,2}\/在其前加斜杠。

这并不对许多组合工作,我已经测试10/10/1011/12/13等…

但令我惊讶的(?<=^\d\d\/)[\d]{1,2}是。

但是[\d]{1,2}如果\d\d这样做也应该匹配,否则我错了吗?


问题答案:

落后支持

正则表达式的主要口味对后视的支持不同。有些施加了一定的限制,有些甚至根本不支持它。

  • Javascript:不支持
  • Python:仅固定长度
  • Java:仅有限长度
  • .NET:无限制

参考文献

  • Regular-expressions.info/比较

蟒蛇

在仅支持固定长度的向后查找的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")

参考文献

  • Regular-expressions.info/环顾四周,字符类,交替,捕获组

爪哇

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提供了一个 消息。因此,在