正则表达式
元字符
元字符 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白字符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
限定符
限定符 | 说明 |
---|
| 重复0次或更多次
| 重复一次或更多次
? | 重复0次或一次 {n} | 重复n次 {n, } | 重复n次或更多次 {n, m} | 重复n到m次
指定范围
使用[]
来指定一个字符的范围,如[a-zABC]匹配的是a到z以及A、B、C中的任意一个字符。
分支条件
使用 |
来分隔不同的条件
捕获分组
使用小括号指定一个子表达式后,匹配这个子表达式的文本,每个分组会有一个组号,规则是从左向右以分组的左括号为标志,第一个出现的分组的组号是1,第二个是2…
后向引用
用于重复搜索前面的某个分组匹配的文本,\b(\w+)\b\s+\1\b
可以用来匹配重复的单词,\1
代表第一个分组匹配的文本 也可以指定分组名,语法:(?<Word>\w+)
或者 (?’word’\w+)
,要反向引用使用\k<Word>
懒惰模式
当正在表达式中包含能够接受重复的限定符时,通常是匹配尽可能多的字符,而懒惰是匹配尽量少的字符.
代码 | 语法 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n, }? | 重复n次以上,但尽可能少重复 |
常用分组语法
捕获
代码 | 说明 |
---|---|
(exp) | 匹配exp,并捕获文本到自动命名的组里 |
(?exp) | 匹配exp,并捕获文本到名称为name的组里 |
(?:exp) | 匹配exp,不捕获文本,也不分配组号 |
零宽断言
当我们需要捕获的内容前后必须是特定内容,但又不需要捕获这些特定内容的时候,就会用到零宽断言
代码 | 说明 |
---|---|
(?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 |
(!exp) | 匹配后面跟的不是exp的位置 |
(?<!exp) | 匹配前面不是exp的位置 |
注释: (?#comment) 注释
例如:匹配url中的某个参数 (?<=[?&])param=[^&]*&?
,零宽断言要求匹配的 param=
前面必须是 ?
或者 &
,但是 ?
或者 &
不计入到匹配项中。
在Java中使用正则
使用正则提取匹配内容
String ip = "ip:127.0.0.1";
Pattern pattern = Pattern.compile("((?:(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(?:25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d))))");
Matcher matcher = pattern.matcher(ip);
if ( matcher.find() ) {
System.out.println("Found value: " + matcher.group(0));
}
System.out.println(matcher.replaceAll(" I am matcher replace [$1] ha"));
替换文本内容
String text = "here is [text] and a [input]";
// $1 代表正则表达式第一个捕获组括号中的内容
System.out.println(text.replaceFirst("\\[(.*?)]", "{$1}"));
System.out.println(text.replaceAll("\\[(.*?)]", "{$1}"));
JavaScript中使用正则
/\\[(.*?)]/i.test("here is [text] ");
local_offer #other
navigate_before markdown 语法 navigate_next python3 安装protobuf模块