跳至主要內容

正则表达式

zzz大约 2 分钟

正则表达式

正则可视化open in new window

stackoverflow在线测试open in new window

runoob在线测试open in new window

概念

菜鸟语法open in new window

提示

  • Java中是贪婪匹配,在Java中转义用\\
  • 中括号[]中的元字符表示匹配元字符本身,如:[.]等价于匹配.本身,等价于\\.

分组、捕获、反向引用

定为符

字符描述
^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
\b匹配一个单词边界,即字与空格间的位置。匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者前面跟其他“字”字符的位置,例如在字母和空格之间。注意,匹配中不包括匹配的字边界。换句话说,一个匹配的词的边界的内容的长度是 0
\B非单词边界匹配。

分组

分组分为捕获分组非捕获分组

  • 捕获分组

用圆括号()将所有选择项括起来,相邻的选择项之间用 | 分隔。

()表示捕获分组,()会把每个分组里的匹配的值保存起来, 多个匹配值可以通过数字 n 来查看(n 是一个数字,表示第 n 个捕获组的内容)。

matcher.group(0)表示匹配到的内容

matcher.group(1)表示匹配到的第1个分组的内容

matcher.group(2)表示匹配到的第2个分组的内容

  • 非捕获分组

包含:?:,?=,?!,?<=,?<!,

如:

exp1(?=exp2):查找 exp2 前面的 exp1。

exp1(?:exp2|exp3):查找 exp1exp2|exp1exp3。

反向引用

  • 引用分组匹配结果

在正则表达式里面通过\分组号来引用

例如:

(\d)(\d)\2\1 将匹配4位数字,第三位和第二位相同,第四位和第一位相同,匹配结果类似:1221 2112

  • 替换操作

通过$分组号来引用

字符串去重

String content = "你好好啊啊啊,我我我我是谁谁";
Pattern compile = Pattern.compile("(.)\\1+");
Matcher matcher = compile.matcher(content);
String result = matcher.replaceAll("$1");
System.out.println(result);

参考地址