### JavaScript正则表达式基础详解
#### 一、正则表达式定义
在JavaScript中,正则表达式是一种用于处理字符串的强大工具,它允许我们执行复杂的查找和替换操作。正则表达式可以通过两种方式进行定义:
1. **构造函数**:
```javascript
var reg = new RegExp('<%[^%>]+%>', 'g');
```
这里`<%[^%>]+%>`是正则表达式的模式,`g`是标志位,表示全局搜索。
2. **字面量**:
```javascript
var reg = /<%[^%>]%>/g;
```
字面量的方式更为简洁,也是更常用的一种方式。标志位如`g`、`i`、`m`可以放在最后指定正则的行为:
- `g`: global,全局匹配,即在整个字符串中进行多次匹配。
- `i`: ignore case,忽略大小写。
- `m`: multiline,多行匹配,改变`^`和`$`的行为,使其能够匹配每一行的开始和结束,而不仅仅是整个字符串的开始和结束。
#### 二、元字符
元字符是指在正则表达式中具有特殊意义的字符,它们可以用来定义模式中的各种规则。
- **点`.`**:匹配任何单个字符(除了换行符)。
- **星号`*`**:零次或多次匹配前面的字符或子表达式。
- **加号`+`**:一次或多次匹配前面的字符或子表达式。
- **问号`?`**:零次或一次匹配前面的字符或子表达式。
- **左括号`(`** 和 **右括号`)`**:用于定义捕获组。
- **竖线`|`**:表示“或”操作,用于匹配两个或多个选项之一。
- **方括号`[]`**:定义字符集,匹配方括号内的任何单个字符。
- **反斜杠`\`**:用于转义特殊字符,例如`\.`将匹配点字符而非任何字符。
- **开括号`{`** 和 **闭括号`}`**:定义重复次数。
- **撇号`^`**:在方括号内时,表示取反;在字符串开始处,表示匹配字符串的开始位置。
- **美元符号`$`**:表示匹配字符串的结束位置。
- **减号`-`**:在方括号内时,用于定义字符范围。
#### 三、预定义特殊字符
除了元字符外,正则表达式还提供了一系列预定义特殊字符,这些字符有助于快速构建复杂的模式。
- **字符类**:可以使用方括号`[]`来创建一个简单的类。例如,`[abc]`可以匹配字符`a`、`b`或`c`中的任何一个。
- **反向类**:通过在方括号内使用`^`,可以创建一个反向类,如`[^abc]`匹配除了`a`、`b`和`c`之外的任何字符。
- **范围类**:使用`x-y`来定义从`x`到`y`的任何字符,如`[a-z]`用于匹配任何小写字母。
- **预定义类**:如`\d`用于匹配任何数字,`\w`用于匹配任何字母数字字符和下划线,`\s`用于匹配任何空白字符等。
- **边界**:如`\b`表示单词边界,`\B`表示非单词边界。
#### 四、量词
量词用于控制前面的字符或子表达式匹配的次数。
- ** `{n}`**:正好匹配`n`次。
- **`{n,}`**:至少匹配`n`次。
- **`{n,m}`**:至少匹配`n`次,最多匹配`m`次。
- **`?`**:等同于`{0,1}`,表示可选匹配。
- **`*`**:等同于`{0,}`,表示零次或多次匹配。
- **`+`**:等同于`{1,}`,表示一次或多次匹配。
#### 五、贪婪模式与非贪婪模式
- **贪婪模式**:默认情况下,量词是贪婪的,即尽可能多地匹配字符。例如,`\d{3,5}`在`123456789`中将匹配`12345`和`6789`。
- **非贪婪模式**:通过在量词后添加`?`,可以使量词变为非贪婪的,即尽可能少地匹配字符。例如,`\d{3,5}?`在同样的字符串中将匹配`123`、`456`和`789`。
#### 六、分组
分组允许我们将正则表达式的一部分视为一个整体,并对它们进行独立的处理。
- **捕获分组**:使用圆括号`()`来定义捕获分组,例如`(Byron)`。
- **非捕获分组**:如果不需要捕获分组的结果,可以在分组内使用`?:`来定义非捕获分组,例如`(?:Byron)`。
分组不仅可以用于重复模式,还可以用于选择模式,例如`(Byron|Casper)`可以匹配`Byron`或`Casper`。
总结而言,JavaScript中的正则表达式是一种极其强大的工具,掌握了基本的语法和特性之后,你可以轻松地处理各种字符串操作任务。通过结合使用不同的元字符、预定义特殊字符以及量词,你可以构建出复杂且高效的正则表达式。