为什么范围没有按预期工作?

我正在尝试使用正则expression式中的范围模式[01-12]来匹配两位数的mm,但是这并不像预期的那样工作。

您好像误解了字符类定义在正则expression式中的作用。

要匹配任何string0112 ,类似这样的工作:

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

参考

  • regular-expressions.info/Character Classes
    • 数字范围 (在匹配string上有很多例子,解释为数字范围)

说明

一个字符类本身试图匹配inputstring中的一个字符和一个字符。 [01-12]实际上定义了[012] ,一个字符类,匹配input中的一个字符与3个字符02中的任何一个字符。

范围定义从11 ,其中只包括1 。 另一方面,例如[1-9]包括1

初学者经常会犯这样的错误,比如[this|that] 。 这不“工作”。 这个字符定义定义了[this|a] ,也就是说它匹配input中的一个字符与this|的6个字符中的任何一个| 或者a 。 更可能(this|that)是什么意图。

参考

  • regular-expressions.info/Brackets 与垂直条 分组和交替

如何定义范围

所以现在很明显,像between [24-48] hours的模式不“工作”。 这种情况下的字符类相当于[248]

也就是说, -在一个字符类定义中没有定义模式中的数字范围。 正则expression式引擎并不真正“理解”模式中的数字,除了有限重复语法(例如3和5之间a{3,5}匹配)之外。

范围定义使用字符的ASCII / Unicode编码来定义范围。 字符0在ASCII中被编码为十进制48; 9是57.因此,字符定义[0-9]包括编码中值在小数点48和57之间的所有字符。 相当明智地,通过devise,这些是字符0 ,…, 9

也可以看看

  • 维基百科/ ASCII

又如:A到Z

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

在ASCII中:

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

这意味着:

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

相关问题

  • 是正则expression式[aZ]是否有效,如果是,那么是否与[a-zA-Z]相同

正则expression式中的字符类(用语法表示)指定与input中的单个字符相匹配的规则。 因此,括号内的所有内容都指定了如何匹配单个字符

你的模式, [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)

然后你将不得不写一个正则expression式,看起来像这样:

  +-- 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 

请注意,尝试将它们组合起来以获得较短的expression式将会失败,通过给无效input提供错误的肯定匹配。

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

我试图find更多关于字符类的更多信息,但是现在我可以给你的是这个Google Query for Regex Character Classes 。 希望你能在这里find更多的信息来帮助你。

这也适用:

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

[1-9]在1和9之间匹配单个数字

[0-1][0-2]在10和12之间匹配两位数

这里有一些很好的例子

由于polygenelubricants说,由于字符类([]中的东西)匹配字符而不是string,因此您将查找0 | 1-1 | 2而不是您想要的。

正则expression式中的[] s表示一个字符类 。 如果没有指定范围,则隐含地或同时包含其中的每个字符。 因此, [abcde](a|b|c|d|e) ,除了它不捕获任何东西; 它将匹配abcde中的任何一个。 所有范围表示是一组字符 ; [ac-eg]表示“匹配以下任何一个: a ; ce之间的任何字符;或者g ”。 因此,你的匹配说“匹配任何一个: 0 ;任何11之间的字符( 只有1 );或2

您的目标显然是指定一个数字范围:用两位数字写的0112之间的任何数字。 在这个特定的情况下,你可以将它与0[1-9]|1[0-2]匹配:或者是19之间的任意数字,或者是02之间的数字。 一般来说,你可以用类似的方式将任何数字范围转换成有效的正则expression式。 可能比正则expression式有一个更好的select,但是,或者可以为您构build正则expression式的现有函数或模块。 这取决于你的语言。

要解决这个问题,你可以使用/^[0-1][0-9]$/; 如果你只想要0112 ,你需要检查两个条件:

if使用if语句,值是否为00

 if(thevale=="00") { // message to user...not allowed } 

和:

 if(thevalue >=13) { // message to user...not allowed } 

JavaScript中的示例代码:

 function CheckMonth(txtBox) { var ex = /^[0-1][0-9]$/; if (txtBox.value.trim() != "") { if (txtBox.value.trim() == "00") { alert('Please enter valid numbers.'); txtBox.value = ""; txtBox.focus(); } else if (ex.test(txtBox.value.trim()) == false) { alert('Please enter valid numbers.'); txtBox.value = ""; txtBox.focus(); } else if (parseInt(txtBox.value.trim()) >= 13) { alert('Please enter valid numbers.'); txtBox.value = ""; txtBox.focus(); } } }