regex - 为什么 [01-12] 范围没有按预期工作?

标签 regex

我尝试在正则表达式中使用范围模式 [01-12] 来匹配两位数 mm,但这无法按预期工作。

最佳答案

您似乎误解了正则表达式中字符类定义的工作原理。

匹配任何字符串01 , 02 , 03 , 04 , 05 , 06 , 07 , 08 , 09 , 10 , 11 ,或12 ,这样的事情有效:

0[1-9]|1[0-2]

引用文献

<小时/>

说明

字符类本身会尝试匹配输入字符串中的一个且恰好一个字符。 [01-12]实际上定义了[012] ,一种字符类,将输入中的一个字符与 3 个字符 0 中的任意一个进行匹配, 1 ,或2 .

-范围定义从1开始至1 ,其中仅包括 1 。另一方面,类似 [1-9]包括1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 .

初学者经常犯这样的错误:定义诸如[this|that]之类的东西。 。这不起作用。此字符定义定义 [this|a] ,即它将输入中的一个字符与 t 中的 6 个字符中的任何一个进行匹配。 , h , i , s , |a 。很有可能(this|that)这就是我们想要的。

引用文献

<小时/>

如何定义范围

所以现在很明显像 between [24-48] hours 这样的模式不“工作”。本例中的字符类相当于 [248] .

-字符类定义中的 不定义模式中的数字范围。正则表达式引擎并不真正“理解”模式中的数字,有限重复语法除外(例如 a{3,5} 匹配 3 到 5 a )。

范围定义改为使用字符的 ASCII/Unicode 编码来定义范围。角色0以 ASCII 编码为十进制 48; 9是 57。因此,字符定义 [0-9]包括编码中十进制 48 到 57 之间的所有字符。相当明智的是,根据设计,这些字符是 0 , 1 , ..., 9 .

另请参阅

<小时/>

另一个例子:A到Z

让我们看一下另一个常见的字符类定义[a-zA-Z]

以 ASCII 表示:

  • A = 65, Z = 90
  • a = 97, z = 122

这意味着:

  • [a-zA-Z][A-Za-z]是等价的
  • 在大多数口味中,[a-Z]可能是非法字符范围
    • 因为a (97)“大于”Z (90)
  • [A-z]是合法的,但还包括这六个字符:
    • [ (91), \ (92), ] (93), ^ (94), _ (95), ` (96)

相关问题

关于regex - 为什么 [01-12] 范围没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3148240/

相关文章:

regex - 使用最新预索引设置的大型源代码的文本搜索工具?

c# - 如何找到已被另一场比赛捕获的一场比赛?

javascript - 为什么这不是有效的正则表达式?

javascript - 按空格分割字符串,没有空元素?

c# - 用于取消连接字符串的正则表达式(或更好的)方法

c++ - 在 RegExp 中使用星号来提取包含在特定模式中的数据

javascript - 如何从 JSON 字符串中检索多个属性值

Java:在正则表达式查询中使用占位符

javascript - 正则表达式多次匹配多个相同的表达式

Python 正则表达式匹配