这是我创建要在JavaScript中使用的正则表达式:
var reg_num = /^(7|8|9)\d{9}$/
这是我的团队成员建议的另一个。
var reg_num = /^[7|8|9][\d]{9}$/
规则是验证电话号码:
- 它应该只有十个数字。
- 第一个数字应该是7、8或9中的任何一个。
这是我创建要在JavaScript中使用的正则表达式:
var reg_num = /^(7|8|9)\d{9}$/
这是我的团队成员建议的另一个。
var reg_num = /^[7|8|9][\d]{9}$/
规则是验证电话号码:
Answers:
这些正则表达式是等效的(出于匹配目的):
/^(7|8|9)\d{9}$/
/^[789]\d{9}$/
/^[7-9]\d{9}$/
说明:
(a|b|c)
是一个正则表达式“ OR”,表示“ a或b或c”,尽管OR所必需的括号也可以捕获该数字。严格来说,您可以编写代码(?:7|8|9)
使其成为一个非捕获组。
[abc]
是“字符类”,表示“来自a,b或c的任何字符”(字符类可以使用范围,例如[a-d]
= [abcd]
)
这些正则表达式相似的原因是,字符类是“或”的缩写(但仅适用于单个字符)。另外,您还可以执行(abc|def)
不转换为字符类的操作。
[<<|>>|\]\]|\[\[]
。由于上下文的原因,我知道正则表达式试图匹配<<
or >>
或[[
or ]]
。但是从您所说的来看,它应该与<
or >
或[
or 匹配]
。如果在|
之间使用[]
,括号的行为会有所不同吗?
|
字符类中使用[...]
,除非您要匹配管道字符本身。同样,在字符类中复制字符也不起作用-字符类是一个字符列表,将与它们中的一个完全匹配。我的猜测是,你想要一个组,使用正常的圆括弧:(<<|>>|\]\]|\[\[)
您团队的建议几乎是正确的,除了所犯的错误。一旦找到原因,您将永远不会忘记它。看一下这个错误。
/^(7|8|9)\d{9}$/
这是做什么的:
^
和$
表示锚定匹配,它断言在这些锚定件之间的子模式是整个匹配。仅当子模式与整个字符串匹配时才匹配字符串,而不仅仅是部分匹配。()
表示捕获组。7|8|9
表示匹配的任一7
,8
或9
。它通过交替进行操作,这是管道操作员|
所做的工作–在交替之间交替进行。在交替之间回溯:如果第一个交替不匹配,则引擎必须在交替匹配期间指针位置移动之前返回,以继续匹配下一个交替;而角色类可以顺序前进。在禁用优化的正则表达式引擎上查看此匹配项:Pattern: (r|f)at
Match string: carat
Pattern: [rf]at
Match string: carat
\d{9}
匹配九位数。\d
是一个简写的元字符,可以匹配任何数字。/^[7|8|9][\d]{9}$/
看一下它的作用:
^
并$
表示锚定的匹配。[7|8|9]
是角色类。从列表中的任何字符7
,|
,8
,|
,或9
可以被匹配,因此,|
在错误地添加。这匹配没有回溯。[\d]
是居住在元字符上的角色类\d
。顺便说一句,结合使用字符类和单个元字符是一个坏主意,因为抽象层会减慢匹配速度,但这只是实现细节,仅适用于一些正则表达式实现。JavaScript不是其中之一,但是它会使子模式稍微更长一些。{9}
表示先前的单个构建体总共重复了9次。最佳正则表达式为/^[789]\d{9}$/
,因为/^(7|8|9)\d{9}$/
不必要的捕获会导致大多数正则表达式实现的性能下降(javascript碰巧是一个,考虑到问题var
在代码中使用关键字,这可能是JavaScript)。指某东西的用途的PHP在PCRE上运行以进行预匹配的对象可以优化回溯的缺失,但是我们也不在PHP中,因此使用类[]
而不是轮换可以|
提高性能,因为匹配不会回溯,因此匹配和失败都比使用您的更快以前的正则表达式。
如果您通过某种方式替换它们,则前两个示例的行为会大不相同。如果您对此进行匹配:
str = str.replace(/^(7|8|9)/ig,'');
您将用空字符串替换7或8或9。
如果您与此匹配
str = str.replace(/^[7|8|9]/ig,'');
您将替换7
or 8
或9
OR垂直栏!!!!由空字符串组成。
我只是很难发现这一点。
|
)。
(7|8|9)
并且[789]
不是等效的,因为前者正在捕获,后者则没有。(?:7|8|9)
另一方面将是等效的(我想您当然知道...)。