我正在尝试使用[01-12]
正则表达式中的范围模式来匹配两位数的mm,但这不能按预期工作。
\d+
模式,2.)在代码中将匹配的字符串转换为数字。然后,3.)检查数字范围,如if(num >= 0 && num <= 12){ /*do something*/ }
。它是如此的快速和灵活。
我正在尝试使用[01-12]
正则表达式中的范围模式来匹配两位数的mm,但这不能按预期工作。
\d+
模式,2.)在代码中将匹配的字符串转换为数字。然后,3.)检查数字范围,如if(num >= 0 && num <= 12){ /*do something*/ }
。它是如此的快速和灵活。
Answers:
您似乎误解了字符类定义在regex中的工作方式。
为了匹配任何字符串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]
,即,它从输入的一个字符对任何的在6个字符相匹配t
,h
,i
,s
,|
或a
。(this|that)
预期的可能性更大。
因此,很明显,现在这样的模式between [24-48] hours
不起作用。在这种情况下,字符类等效于[248]
。
也就是说,-
在字符类定义中,未在模式中定义数字范围。除了有限的重复语法(例如a{3,5}
3到5之间的匹配项a
)外,regex引擎并没有真正“理解”模式中的数字。
范围定义改为使用字符的ASCII / Unicode编码来定义范围。字符0
以ASCII编码为十进制48;9
是57。因此,字符定义[0-9]
包括在编码中其值在十进制48到57之间的所有字符。明智地,通过设计,这些字符0
是1
,...,9
。
让我们看一下另一个常见的字符类定义 [a-zA-Z]
在ASCII中:
A
= 65,Z
= 90a
= 97,z
= 122这意味着:
[a-zA-Z]
和[A-Za-z]
等价[a-Z]
很可能是非法字符范围
a
(97)比Z
(90)“大”[A-z]
是合法的,但还包括以下六个字符:
[
(91),\
(92),]
(93),^
(94),_
(95),`
(96)0[1-9]|1[0-2]
则将无法使用。它更改为下一个合乎逻辑的步骤[1-9]|1[0-2]
并不可以理解的原因(它相匹配的工作,要么1
只能在10
,11
,和12
)。不得不使用\b(?:[0-9]|1[0-1])\b
以防止这种情况。\b
确保regex匹配单词(或本例中的数字)边界(^
&$
不);方括号使或(|
)考虑其另一面;最后?:
是不要使用方括号创建子匹配。
"1,2,3,4,5,6,7,8,9,10,17,18".match(/^(([1-9]|1[0-7])\,?)+$/g )
您能告诉我为什么这个JS正则表达式匹配17以上吗?
用[...]
语法表示的正则表达式中的字符类指定用于匹配输入中单个字符的规则。因此,您在方括号之间编写的所有内容都指定了如何匹配单个字符。
[01-12]
因此,您的模式细分如下:
所以基本上您要匹配的是0、1或2。
为了进行所需的匹配,匹配范围为01-12的两个数字,您需要考虑它们在文本中的外观。
你有:
然后,您必须为此编写一个正则表达式,如下所示:
+-- 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,这比您想要的要多一点。
我试图找到一个确定的资源来获取有关字符类的更多信息,但是现在我只能给您的是Google Regreg字符类查询。希望您能够在此找到更多信息来帮助您。
[0-1][0-2]
也匹配00
。也就是说,为链接+1(我在答案中使用了该链接)。
[0-1][0-2]
必须仔细解释,因为它允许字符串喜欢00
,01
和02
,但不承认03
达09
,终于承认10
,11
和12
。正确的正则表达式为,[1-9]|1[0-2]
甚至0*([1-9]|1[0-2])
(最后一个允许任意数量的前导零)。
[]
正则表达式中的s表示字符类。如果未指定范围,则它隐式地将其中的每个字符或在一起。因此,[abcde]
与相同(a|b|c|d|e)
,除了它不捕获任何内容;它匹配的任何一个a
,b
,c
,d
,或e
。所有范围表示的是一组字符 ; [ac-eg]
说“匹配以下任何一项:和a
之间的任何字符;或”。因此,您的匹配说“匹配以下任何一个:和之间的任何字符(即 just );或。c
e
g
0
1
1
1
2
您的目标显然是指定一个数字范围:介于2 之间的任何数字,01
并12
用两位数字书写。在这种特定情况下,您可以将其与0[1-9]|1[0-2]
以下项匹配:或者0
后面跟着1
and 之间的任何数字9
,或者1
后面跟着0
and 之间的任何数字2
。通常,您可以通过类似的方式将任何数字范围转换为有效的正则表达式。但是,可能有比正则表达式更好的选项,或者有可以为您构造正则表达式的现有函数或模块。这取决于您的语言。
正如多基因润滑剂所说,由于字符类([]中的内容)匹配字符而不是字符串,因此您会寻找0 | 1-1 | 2而不是您想要的。
0|1-1|2
-这种说法非常容易引起误解。像0|1|2
这样的东西会更准确。
用这个:
0?[1-9]|1[012]
要将模式测试为07/2018,请使用以下命令:
/^(0?[1-9]|1[012])\/([2-9][0-9]{3})$/
(日期范围介于01/2000至12/9999之间)
[a-z0-9]
,它匹配所有小写字母和所有数字,但只能作为一个字符。