正则表达式之方括号和小括号加竖线的区别
问题:
在 javascript 中,我使用下面的一个正则,用来验证电话号码:
1. 长度是 10 位
2. 第一位是 7 、8 或 9
var reg_num = /^(7|8|9)\d{9}$/
下面一个是同事推荐使用的:
var reg_num = /^[789]\d{9}$/
回答:
如果只是用来验证,下面的是等价的:
//
/^(7|8|9)\d{9}$/
/^[789]\d{9}$/
/^[7-9]\d{9}$/
//
原因:
(a|b|c) 是正则中的 "OR" ,意思是: "a 或 b 或 c", 尽管方括号也是或的意思,但是小括号提供捕获引用功能。 可以使用
(?:7|8|9) 不捕获引用。
[abc] 是 "单字符集合",意思是 "集合内的任意一个字符 a 或 b 或 c" 。
同时 “单字符集合”为了简写起见,可以使用小横线来表示一个区间,例如:
[a-d] = [abcd]
而
小括号加竖线 则不可以简写。
还有一个原因是,[] 虽然是 or 逻辑的简写,但是只能是匹配单个字符时的或的逻辑。
而
小括号加竖线,则可以写多个字符或的逻辑匹配:
(abc|def)
(7|8|9) 和
[789] 是不等价的,因为前者具有捕获引用功能,而后者没有。
(?:7|8|9) 和
[789] 则是等价。
-
引用:
- http://stackoverflow.com/questions/9801630/what-is-the-difference-between-square-brackets-and-parentheses-in-a-regex
-
分享到:
相关推荐
3. **字符类**:使用方括号`[]`定义一个字符集,如`[abc]`匹配'a'、'b'或'c'。你也可以用`-`来表示范围,如`[a-z]`匹配所有小写字母。 4. **分组与引用**:圆括号`( )`用于创建分组,可以捕获和重用子模式。`\数字`...
4. **分组**:使用小括号()来分组表达式,可以进行子匹配和重复。 5. **预查**:使用(?=)正向预查和(?!负向预查)来匹配后面跟着或不跟着特定模式的字符串。 6. **选择器**:使用竖线|来选择匹配多个模式中的任意一...
为了更精确地匹配,可以使用方括号来指定有意义的字符集,如`t[aeio]n`将只匹配“tan”、“ten”、“tin”和“ton”。 **1.3 “或”符号** 在某些情况下,可能需要匹配多个选项中的任意一个。这种情况下可以使用...
通过使用方括号`[]`可以创建一个字符集,匹配其中的任意一个字符。 **示例:** ```csharp string input = "HeLlo"; Regex regex = new Regex(@"[HL]"); Match match = regex.Match(input); Console.WriteLine(match...
2. 字符集合:使用方括号([])定义一个字符集,如[a-z]匹配所有小写字母。 3. 范围字符:在字符集中使用破折号(-)定义一个范围,如[0-9]匹配所有数字。 4. 量词:除了星号,还有加号(+)表示至少一次,问号(?)表示...
)、竖线(|)、花括号({})、方括号([])、圆括号(())等。 2. **匹配字符**: - 点号(.):匹配任意单个字符,除了换行符。 - 星号(*):匹配前面的字符0次或无限次。 - 加号(+):匹配前面的字符1次或...
1. **字符类(Character Class)**:使用方括号`[]`定义一个字符类,表示匹配其中任意一个字符。例如,`[abc]`匹配'a'、'b'或'c'。 2. **量词(Quantifiers)**:用来指定前面的字符或字符类出现的次数。例如,`*`...
如 "t[abcd]n" 只会匹配 "tan"、"tbn"、"tcn" 和 "tdn",不会匹配 "thn" 或 "tabn",因为它们包含不在方括号内的字符。 3. **竖线** `|`:表示逻辑或,用于指定多个可能的匹配项。例如,`t(a|b|c|dd)n` 只会匹配 ...
- 范围:用方括号`[]`表示匹配其中的任意一个字符。 - 选择:用竖线`|`表示或关系,匹配其左右两边的任一表达式。 - 重复:`{n}`表示精确匹配n次,`{n,}`表示至少匹配n次,`{n,m}`表示匹配n到m次。 - 非贪婪匹配:在...
- **字符类**:使用方括号(`[]`)来定义一系列字符,匹配方括号中任何一个字符,例如 `[a-zA-Z]` 匹配任何小写或大写的英文字母。 - **重复字符类**:如 `+` 表示前面的字符或表达式一次或多次出现,`{n}` 指定前面...
2. **字符类**:方括号([])内的字符集,用于匹配其中任意一个字符,如[A-Za-z]匹配所有大小写字母。 3. **量词**:除了星号、加号和问号,还有花括号({})用于指定精确次数,如{m,n}表示匹配m到n次。 4. **分组与...
- **字符类**:用方括号 `[]` 包裹的一组字符,表示匹配其中的任意一个字符。 - **边界匹配器**:如 `^` 表示字符串的开始,`$` 表示字符串的结束,`\b` 表示单词边界。 2. **正则表达式语法** - **分组与反向...
3. **字符类**:使用方括号`[]`定义一个字符集,如`[abc]`匹配'a'、'b'或'c'。使用`^`在字符类内否定,如`[^abc]`匹配除'a'、'b'、'c'之外的任何字符。 4. **分组与引用**:使用圆括号`()`创建分组,可以捕获和引用...
- **字符类**:用方括号`[]`定义一组字符,如`[abc]`匹配'a'、'b'或'c'。 - **范围**:在字符类中用`-`表示范围,如`[a-z]`匹配小写字母。 - **转义字符**:`\`用于转义特殊字符,如`\.`匹配点号本身。 - **分组与...
4. **字符类**:方括号([])内列举的字符,表示匹配其中任意一个字符。 5. **分组与引用**:圆括号()用于创建子模式,可以对子模式进行引用或反向引用。 6. **边界匹配器**:^匹配行首,$匹配行尾,\b匹配单词边界,\...
1. **字符集(Character Set)**:通过方括号`[]`定义一组字符,如`[abc]`匹配任意一个'a'、'b'或'c'。 2. **量词(Quantifiers)**:用来指定前面的元素出现的次数,例如`*`表示零次或多次,`+`表示一次或多次,`?...
3. **字符类(Character Classes)**:用方括号`[]`定义一个字符类,表示匹配其中任何字符。例如,`[abc]`匹配'a'、'b'或'c',`[^abc]`匹配除了'a'、'b'、'c'之外的任何字符。 4. **分组(Groups)**:使用圆括号`...
3. **字符类**:用方括号`[]`定义一个字符类,如`[abc]`匹配'a'、'b'或'c'。还可以使用短划线`-`表示范围,如`[a-z]`匹配所有小写字母。 4. **量词**:`*`、`+`、`?`分别表示匹配前面的字符零次、一次或多次、零次...