正则匹配

正则匹配即是在给定字符串中查找符合正则表达式的字符。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑

正则匹配常用类

正则匹配中常用的类为Pattern和Matcher类,前者表示匹配的模式串,后者表示匹配的结果。
常用的使用方法如下:

// 待查找字符
String fileName = "workspace/test.apk";
// 构建模式,其中compile方法还可以传入第二个参数,表示匹配方法,常用的有怱略大小写、匹配多行等。
Pattern pattern = Pattern.compile("^workspace/(.+)\\.apk$");
Matcher matcher = pattern.matcher(fileName);

可以使用matcher中的find()以及find(int index)方法来确定是否存在目标字符串。
find()如果查询到了会返回true,并且移动到匹配字符串的末尾,准备下一次的匹配。
find(int index)方法中传入的index是指定查询的起始范围,即从index处开始查找。

常用元字符

用的不多的情况下,经常忘。麻烦,还是记录一下吧。

java正则表达式 排除字符串 java正则匹配任意字符串串_正则匹配


java正则表达式 排除字符串 java正则匹配任意字符串串_java正则表达式 排除字符串_02


java正则表达式 排除字符串 java正则匹配任意字符串串_正则匹配_03


java正则表达式 排除字符串 java正则匹配任意字符串串_java正则表达式 排除字符串_04


图从https://www.runoob.com/regexp/regexp-metachar.html拷贝,方便查阅。

常用场景

如在android中需要将一段字符中符合某些规则的字符加深加粗等显示,则可以使用如下代码实现。

Pattern p = Pattern.compile(targetStr);
Matcher ma = p.matcher(sourceStr);
// 找出所有的目标字符
while (ma.find()) {
	// 匹配到的字符
    String group = ma.group();
    // 匹配到的起点,可以用来确定匹配的字符串所在位置
    int start = ma.start();
    // 也可以使用ma.end()方法代替
    int end = start + group.length();
    // 设置字符串样式
    spannable.setSpan(new ForegroundColorSpan(Color.RED), start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
}

常见问题

在一次调试中,当断点停在find()方法时,返回了false。

java正则表达式 排除字符串 java正则匹配任意字符串串_正则表达式_05


但是通过intelliJ工具的检测及代码测试可以匹配,但是find()却返回了false。

主要原因就是上面说的,如果find()匹配成功后会跳到匹配字符的末尾准备下一次的匹配。而这个false是下一次匹配时返回的。

因为方法执行了一次后,断点查看相当于又执行了一次,故返回了false。

在断点调试时,一定要注意这种结果可能会改变的情形。