为了账号安全,请及时绑定邮箱和手机立即绑定

为什么[01-12]射程不能像预期的那样工作?

/ 猿问

为什么[01-12]射程不能像预期的那样工作?

MYYA 2019-06-26 17:26:12

为什么[01-12]射程不能像预期的那样工作?

我在试着用范围图[01-12]在regex中匹配两位数毫米,但这并不像预期的那样工作。



查看完整描述

3 回答

?
潇湘沐

这也适用于:

^([1-9]|[0-1][0-2])$

[1-9]匹配1到9之间的个位数

[0-1][0-2]匹配10到12之间的两位数

有一些很好的例子这里


查看完整回答
反对 回复 2019-06-26
?
慕函数4003404

您似乎误解了regex中字符类定义的工作方式。

匹配任何字符串0102030405060708091011,或12,像这样的东西起作用了:

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

参考文献


解释

字符类本身试图匹配一个,也就是一个输入字符串中的字符。[01-12]实际定义[012],一个字符类,它将输入中的一个字符与这3个字符中的任何一个进行匹配。01,或2.

这个-范围定义从11,其中包括1..另一方面,就像[1-9]包括123456789.

初学者经常犯定义如下的错误[this|that]..这“行不通”。此字符定义[this|a]中的6个字符中的任何一个与输入中的一个字符匹配。this|a..极有可能(this|that)这就是我们的意图。

参考文献


如何定义范围

所以现在很明显,像这样的模式between [24-48] hours不起作用。本例中的字符类等效于[248].

那是,-在字符类中,定义不定义模式中的数字范围。除了有限的重复语法外,Regex引擎并不真正“理解”模式中的数字。a{3,5}3至5之间的比赛a).

范围定义使用字符的ASCII/Unicode编码来定义范围。人物0在ASCII中编码为十进制48;9是57岁。因此,字符定义[0-9]包括编码中值介于小数48至57之间的所有字符。从设计上来说,这些都是非常明智的。01, ..., 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)

相关问题


查看完整回答
反对 回复 2019-06-26
?
慕尼黑8549860

正则表达式中的字符类,由[...]语法指定要匹配的规则。单一字符在输入中。因此,您在括号中写入的所有内容都指定了如何匹配。单一字符.

你的模式[01-12]因此,细分如下:

  • 0-匹配单数0
  • 或者,1-1匹配1到1范围内的单个数字。
  • 或者,2,匹配一个单数2。

基本上,你们要匹配的是0,1或2。

为了完成你想要的匹配,匹配两个数字,从01-12作为数字,你需要考虑它们作为文本的外观。

你有:

  • 01-09(即第一位是0,第二位是1-9)
  • 10-12(即第一个数字是1,第二个数字是0-2)

然后,您必须为此编写一个正则表达式,它可以如下所示:

  +-- a 0 followed by 1-9
  |
  |      +-- a 1 followed by 0-2
  |      |<-+--> <-+-->0[1-9]|1[0-2]
      ^
      |
      +-- vertical bar, this roughly means "OR" in this context

请注意,试图组合它们以获得较短的表达式将失败,因为对无效输入提供错误的正匹配。

例如,模式[0-1][0-9]基本上与数字00-19相匹配,这比你想要的要多一点。

关于字符类的更多信息,我试图找到一个明确的来源,但现在我所能给您的只有以下几个Regex字符类的Google查询..希望你能在那里找到更多的信息来帮助你。


查看完整回答
反对 回复 2019-06-26

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信