当前位置: 首页 > 知识库问答 >
问题:

为什么在正则表达式组中未捕获特殊字符

许华清
2023-03-14

我有以下正则表达式来捕获正

\b(?<sign>[\-\+]?)(?<hours>2[1-3]|[01][0-9]|[1-9]):(?<minutes>[0-5]\d)\b

它很匹配,但前导符号没有出现在捕获组中。我的格式有错吗?你可以在这里看到效果https://regex101.com/r/CQxL8q/1/

共有2个答案

慕容聪
2023-03-14

单词边界锚(\b)匹配单词字符(字母、数字或下划线)到非单词字符之间的转换,反之亦然。-13:21中没有这样的转换。

单词边界锚定可以停留在符号和小时之间,以避免在看起来与时间相似的表达式中匹配它(65401:23),但不能阻止它匹配654:01:23

顺便说一下,[\-\ ]只是编写[- ]的一种复杂方式。在字符类中没有任何特殊含义,不需要转义。-是字符类中的特殊字符,但不是第一个或最后一个字符(即[--])。

另一个注释:在regex中同时使用[0-9]\d。它们表示相同的东西1但是,为了易读性,建议只坚持一种约定。由于使用了只包含数字的其他字符类,我将使用[0-9]而不是\d

regex片段中的一些错误持续了数小时:2[1-3]|[01][0-9]|[1-9]不匹配0>(但它匹配0020

鉴于上述所有更正和改进,regex应该是:

(?<sign>[-+]?)\b(?<hours>2[0-3]|[01][0-9]|[0-9]):(?<minutes>[0-5][0-9])\b

未设置 Unicode 标志时,1 \d[0-9] 相同。启用 Unicode 后,\d 还会匹配非基于拉丁语的字母表中的数字。

秦俊
2023-03-14

这是因为第一个\b\b单词边界在字符串/换行符的开头和-(即非单词字符)之间不匹配。

您需要将单词边界移动到可选的< code >符号组之后:

(?<sign>[-+]?)\b(?<hours>2[1-3]|[01][0-9]|[1-9]):(?<minutes>[0-5][0-9])\b
              ^^

请参阅正则表达式演示。

现在,由于单词边界后面的char是一个数字(一个单词char),单词边界将正常工作,如果数字前面有另一个单词char,则所有匹配都失败。

 类似资料:
  • 假设我有这个虚拟URL,我需要提取植物及其颜色作为 下面的I have正在按预期捕获我需要的元素,但是当我的URL中的植物少于4株时,它无法捕获任何东西。底部有一个指向regex测试员的链接,其中有示例代码和URL,您可以使用。 如何修改这个正则表达式,使其动态工作,从而在不需要静态URL结构的情况下捕获可用内容。现在,假设我最多只能捕获4株植物(8组) https://regex101.com/

  • 问题内容: 非捕获组(即)在正则表达式中如何使用?它们有什么用? 问题答案: 让我尝试用一​​个例子来解释。 现在,如果我将下面的正则表达式应用于它… …我将得到以下结果: 但我不在乎协议-我只想要URL的主机和路径。因此,我将正则表达式更改为包括非捕获组(?:)。 现在,我的结果如下所示: 看到?第一组尚未被捕获。解析器使用它来匹配文本,但是稍后在最终结果中将其忽略。 编辑: 根据要求,我也尝试

  • 我有一个类似这样的字符串: 但是我得到了一个 你知道我做错了什么吗?

  • 问题内容: 从Java 6 模式文档中: 特殊构造(非捕获) X X ,作为非捕获组 … X X ,作为独立的非捕获组 之间和有什么区别?在这种情况下, 独立 意味着什么? 问题答案: 这意味着分组是原子的,它会丢弃匹配组的回溯信息。因此,该表达式是所有格;即使这样做是正则表达式整体成功的唯一途径,它也不会退缩。它是“独立的”,即它不会通过回溯与正则表达式的其他元素协作来确保匹配。

  • 在Python中,如何在非捕获组中捕获组?换句话说,如何重复包含捕获组的非捕获子模式? 例如,捕获导入字符串上的所有包名。例如,字符串: 导入熊猫、操作系统、系统 将返回“pandas”、“os”和“sys”。下面的模式捕获第一个包并到达第二个包: 从这里,我想重复捕获组并匹配以下字符的子模式,即。当我用一个非捕获组包围这个子模式并重复它时: 它不再捕捉里面的群体。

  • 问题内容: 我正在尝试使用Java expr在:之后捕获正确的部分,但是在以下代码中,打印的捕获组是整个字符串,怎么了? 问题答案: 子组的编号从1开始,全文为0。只需循环执行count + 1。