正则表达式
other 

元字符

元字符说明
.匹配除换行符以外的任意字符
\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 navigate_next