这里只分享一些我常用的正则式技巧,都是结合我的实际使用为例
常用的正则式
- 匹配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_INSENSITIVE
和UNICODE_CASE
,MULTILINE
偶尔也会用得上
其他的一些技巧
替换标签[比如自定义占位符]
有的时候我们可能需要大量重复但格式近似的文件,比如ibatis或mybatis的domain,mapper这些文件,每个人的风格不同,复制粘贴需要修改很多地方,且易出错 我们可以把需要修改的地方用自己定义的占位符替换掉,这里简单说思路,可能有不完善处:
- 利用正则式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);
}
- 替换标签为%s
res=res.replaceAll("<demo>([\\s\\S]*?)</demo>","%s");
- 处理数组的内容,并把结果贴上去
res=String.format(res,list.toArray());