目录
方法一:String的contains方法
方法二:正则表达式
方法三:String的indexOf方法
代码示例
方法一:String的contains方法
这个是String自带的子串匹配方法,其实其内里实现就是方法三,下面详细讲。
方法二:正则表达式
几个方法的定义与使用
Pattern.compile():Pattern构造器是私有的,不能通过new创建Pattern对象,可以通过Pattern调用静态方法compile返回Pattern实例,其内部实现是new Pattern(regex, 0)。
Pattern.complie(String regex,int flag):它接收一个标记参数,调整匹配行为。regex 表示定义的规则。flag 表示设置的参数类型,主要包含以下几种情况。
- Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不明感的匹配只适用于US-ASCII字符集。让表达式忽略大小写进行匹配。
- Pattern.COMMENTS(?x) 此种模式下,匹配时会忽略表达式中空格字符(表达式里的空格,tab,回车)。注释从#开始,一直到这行结束。
- Pattern.UNIX_LINES(?d) 此种模式下,只有’\n’才被认作一行的中止,并且与’.’,’^’,以及’$’进行匹配。
- Pattern.MULTILINE(?m) 此种模式下,上箭头和单引号分别匹配一行的开始和结束。此外,’^‘仍然匹配字符串的开始,’’也匹配字符串的结束。默认情况下,这两个表达式仅仅匹配字符串的开始和结束。
- Pattern.DOTALL:此种模式下,表达式’.‘可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式’.'不匹配行的结束符。
matcher.find()和 matcher.matches()的区别:find()方法是部分匹配,是查找输入串中与模式匹配的子串,如果该匹配的串有组还可以使用group()函数。matches()是全部匹配,是将整个输入串与模式匹配,如果要验证一个输入的数据是否为数字类型或其他类型,一般要用matches()。
方法三:String的indexOf方法
indexOf方法:返回指定字符str在字符串中(方法调用者)第一次出现处的起始索引,如果此字符串中没有这样的字符,则返回 -1。
因此,如果待匹配字符串在目标字符串中存在的话,那么indexOf方法的返回值一定大于0。
代码示例
public class StringFuzzyTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
list.add("liliu");
String keyword = "li";
List<String> answer1 = new ArrayList<>();
answer1.addAll(list.stream().filter(one -> one.contains(keyword)).collect(Collectors.toList()));
System.out.println("1. String的contains方法");
answer1.forEach(System.out::println);
List<String> answer2 = new ArrayList<>();
Pattern regex = Pattern.compile(keyword);
answer2.addAll(list.stream().filter(one -> regex.matcher(one).find()).collect(Collectors.toList()));
System.out.println("2. 正则表达式");
answer2.forEach(System.out::println);
List<String> answer3 = new ArrayList<>();
answer3.addAll(list.stream().filter(one -> one.indexOf(keyword) > -1).collect(Collectors.toList()));
System.out.println("3. String的indexOf方法,大于-1说明找得到");
answer3.forEach(System.out::println);
}
}