参考 正则表达式30分钟入门教程。
| 序号 | 元字符 | 描述 |
|---|---|---|
| . | 查找单个字符,除了换行和行结束符。 | |
| \w | 查找单词字符。等价于[a-zA-Z0-9_]。 | |
| \W | 查找非单词字符。等价于[^a-zA-Z0-9_]。 | |
| \d | 查找数字,等价于[0-9]。 | |
| \D | 查找非数字字符,等价于[^0-9]。 | |
| \s | 查找空白字符,包括空格、换行、回车、制表符等等,[ \n\r\t\v\f]。 | |
| \S | 查找非空白字符。 | |
| \b | 匹配单词边界,例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。 | |
| \B | 匹配非单词边界。 | |
| \0 | 查找 NUL 字符。 | |
| \n | 查找换行符。 | |
| \f | 查找换页符。 | |
| \r | 查找回车符。 | |
| \t | 查找制表符。 | |
| \v | 查找垂直制表符。 | |
| ^ | 匹配字符串开始的位置,如果设置了多行,匹配\r或\n 之后的位置。 | |
| $ | 匹配字符串结束的位置,如果设置了多行,匹配\r或\n 之前的位置。 |
| 序号 | 量词 | 描述 |
|---|---|---|
| * | 匹配0次、1次或者多次,等价于{0,}。 | |
| + | 匹配1次或者多次,等价于{1,}。 | |
| ? | 匹配0次、1次,等价于{0,1}。 | |
| {n} | 匹配 n 次。 | |
| {n,} | 匹配至少 n 次。 | |
| {n,m} | 匹配 n 到 m 次。 |
| 序号 | 表达式 | 描述 |
| [abc] | 字符集,匹配当中的任何一个字符。 | |
| [^abc] | 匹配不包含的任何字符。 | |
| [0-9] | 匹配数字字符,等价于\d 或者 [0123456789]。 | |
| [a-z] | 匹配26个小写英文字符。 |
| 序号 | 表达式 | 说明 |
|---|---|---|
| (pattern) | 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。 | |
| (?:pattern) | 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。 | |
| (?=pattern) | 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 | |
| (?!pattern) | 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 | |
| (?<=pattern) | 反向肯定预查,与正向肯定预查类拟,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。 | |
| (?<!pattern) | 反向否定预查,与正向否定预查类拟,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。 |
贪婪匹配与非贪婪匹配:当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
在头文件 regex 中有关于正则表达式的实现和接口。
cmatch、smatch 类保存匹配结果。
var p = /pattern/attribute ;var p = new RegExp(pattern, attribute) ;查找本网页上的超链接地址。
var html = document.querySelector("body").innerHTML;
var p = /(?<=href\s*?=\s*?").*?(?=" *)/g;
var r = html.match(p);
console.log(r);
PowerShell 使用Regex 类来实现正则表达式,命名空间是 System.Text.RegularExpressions。在PowerShell 中可直接使用regex。
Regex 类的常用方法。
$p = New-Object System.Text.RegularExpressions.Regex('(?<=href\s*?=\s*?").*?(?=" *)')
$p = [regex]('(?<=href\s*?=\s*?").*?(?=" *)')
$html = @"
<nav class="navbar navbar-default">
......
</div>
"@
$r =[System.Text.RegularExpressions.Regex]::Matches($html, $p)
$r = [regex]::Matches($html, $p)
$r|ForEach-Object{$_.value}
Python 中的正则表达式由 re 模块提供。由于\ 在字符串中有转意的作用,与正则表达式冲突,通常需要双斜杠(\\),可以使用r'string' 语法,r表示字符字面量,不转意。
获取网页中的URL。
import requests
import re
url = 'https://jackleegithub.github.io/regExp.html';
r = requests.get(url);
html = r.text
p = re.compile(r'(?<=href=").*?(?=")');
urls = re.findall(p, html)
for url in urls:
print(url)
正则表达式都是第三方类(库,模块)提供支持,模式字符串的字面量书写会有细微差别,JS和Python 感觉最好;类库都提供了模式匹配、查找、替换的方法,JS主要是字符串提供方法。