这里只分享一些我常用的正则式技巧,都是结合我的实际使用为例

常用的正则式

  • 匹配url:https?://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|] 有些特例也会被匹配到,比如 http://.com,毕竟url不容易验证
  • 匹配汉字:[\u4e00-\u9fa5] 有时候要求输入数字英文和汉字,可以这么写:[\d|\w|\u4e00-\u9fa5]+?
  • 匹配数字:\p{Digit}+ , [0-9]+ , \d+
  • 匹配标签:<html>(.*?)</html> 默认.并不匹配换行符,需要使用<xxx>([\s\S]*?)</xxx> 来匹配

需要escape的特殊字符

$()*+.[]?\^{}|

字符串escape[比如匹配指定前缀]

有的时候我们要匹配指定前缀,难免会有一些特殊字符,比如: $(xxx)-01 , $(xxx)-02 , $(xxx)-03 这里涉及到escape的字符,需要替换,否则会当做正则式的特殊符号处理 正常都是replaceAll解决,其实有更简单的办法 我们可以通过 ** Pattern.quote ** 解决 String regex=Pattern.quote("$(xxx)-") + "\\d+";

单词边界[适用于在编辑器中搜索变量]

\b表示完整单词 \B表示单词内局部内容 比如在编辑器里搜索,通常编辑器里都支持正则式的搜索,搜索变量 abc 可以搜索 \babc\b 这是我常用的方法

匹配后缀文件名[比如abc.xls和def.xls都要匹配到]

对于文件后缀,我们可以忽略大小写,这里我们要用到一个技巧: (?i)不会区分大小写,如果表示一段区间,可以用(?-i)结束 比如上面的例子,我们可以这么写 "^.+\\.(?i)(xls)(?-i)$" 可以直接用字符串的match方法匹配 "abcdef.XLS".matches("^.+\\.(?i)(xls)(?-i)$");

正则式的匹配方式

类型

说明

CANON_EQ

启用规范等价。

CASE_INSENSITIVE

启用不区分大小写的匹配。

COMMENTS

模式中允许空白和注释。

DOTALL

启用 dotall 模式。

LITERAL

启用模式的字面值解析。

MULTILINE

启用多行模式。

UNICODE_CASE

启用 Unicode 感知的大小写折叠。

UNIX_LINES

启用 Unix 行模式。

这里我比较常用的就是CASE_INSENSITIVEUNICODE_CASE,MULTILINE偶尔也会用得上

其他的一些技巧

替换标签[比如自定义占位符]

有的时候我们可能需要大量重复但格式近似的文件,比如ibatis或mybatis的domain,mapper这些文件,每个人的风格不同,复制粘贴需要修改很多地方,且易出错 我们可以把需要修改的地方用自己定义的占位符替换掉,这里简单说思路,可能有不完善处:

  1. 利用正则式match括号中的内容,存为数组,简单的代码如下:
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher m = p.matcher(input);
        while (m.find()) {
            String temp2=m.group(1);
            temp.add(temp2);
        }
  1. 替换标签为%s res=res.replaceAll("<demo>([\\s\\S]*?)</demo>","%s");
  2. 处理数组的内容,并把结果贴上去 res=String.format(res,list.toArray());