http://blog.csdn.net/pipisorry/article/details/51059500
正则表达式
- 编译正则表达式的字符串值构造对应的模式Pattern对象
- 创建匹配给定输入与此模式的匹配器Matcher
- 通过匹配器对象执行操作,匹配器对象的方法很丰富,互相组合使用更强大(JDK在线API)
java里面所有的中英文+数字:[\w\u4e00-\u9fa5]
正则表达式的一般规则都一样,见[python正则表达式]
规则参考[python正则表达式-Python支持的正则表达式元字符和语法-特殊构造]
java正则表达式中的特殊字符转义
特殊字符串直接贴到idea中的“”里面时,会直接将\变成\\(\\变成\\\\)将"变成\"
[]里面的特殊字符至少有这些:\[]"
其它的:
1.字符"|","*","+"都得加上转义字符,前面加上"\\"。
2.而如果是"\",那么就得写成"\\\\"。
java字符串分割
java正则表达式可以使用库java.util.regex
也可以使用String自带的方法如sourceStr.split(regex,maxSplit),split 的实现直接调用的 matcher 类的 split 的方法
StringTokenizer 类允许应用程序将字符串分解为标记。StringTokenizer 是出于兼容性的原因而被保留的遗留类(虽然在新代码中并不鼓励使用它)。建议所有寻求此功能的人使用 String 的 split 方法或 java.util.regex 包。但是StringTokenizer对于字符串"192.168..33"的分割,返回的字符串数组只有3个元素,对于两个分隔符之间的空字符串会忽略,这个要慎重使用。但是String.split(String.split是用正则表达式匹配,所以不使用KMP字符串匹配算法)用的都是按顺序遍历的算法,时间复杂度O(m*n),较高,所以性能上,StringTokenizer好很多,对于频繁使用字符串分割的应用,例如etl数据处理,使用StringTokenizer性能可以提高很多。
使用示例
[Java进阶——使用正则表达式检索、替换String中的特定字符和关于正则表达式的一切_CrazyMo_的博客-CSDN博客]
替换replace
常用停用词stopwords:[`!@#$%^&~()*+-=|\[\]{}'":;,.<>《》?‘!¥()—【】’”:;。,、?…\s/\\]
String regReplace = "[`!@#$%^&~()*+-=|\\[\\]{}'\":;,.<>《》?‘!¥()—【】’”:;。,、?…\\s/\\\\]";
Pattern regReplacePat = Pattern.compile(regReplace);
String str1 = regReplacePat.matcher(s).replaceAll("");
测试cases:
List<String> ss = Arrays.asList("夏/装", "老.板,夏\\装", "ys-l", "ys|l \"限——量版-(口红)", " ysl[]限量版-[星空]口红 ");
for (String s : ss) {
System.out.println(s);
String str1 = regReplacePat.matcher(s).replaceAll("");
System.out.println(str1);
}
判断是否全匹配
String regMatch = "^******$";
方式1:
boolean ifAllMatch = Pattern.matches(regMatch, str1);
方式2:
Pattern regMatchPat = Pattern.compile(regMatch);
boolean ifAllMatch = regMatchPat.matcher(str1).find();
查找并抽取对应条件字符串
package Test;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
Test t = new Test();
t.test4();
}
public void test4() {
Pattern pattern = Pattern.compile("(.+?)\\(R(.+?)\\)");
Matcher matcher = pattern.matcher("avg(R4)");
if (matcher.find()) {
System.out.println(matcher.group(1));// 分组的索引值是从1开始的,所以取第一个分组的方法是m.group(1)而不是m.group(0)。
System.out.println(matcher.group(2));
}
}
}
avg
4
前向后向查找
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
Test t = new Test();
t.t7();
}
public void t7() {
// 向后匹配
String a = "I paid $90 for 10 oranges, 12 pears and 8 apples. I saved $5 on ";
Pattern p = Pattern.compile("(?<=\\$)\\d+");
Matcher m = p.matcher(a);
while (m.find()) {
String group = m.group();
System.out.println(group);
}
// 向前匹配
a = "https://mail.huawei.com ";
p = Pattern.compile(".+(?=:)");
m = p.matcher(a);
while (m.find()) {
String group = m.group();
System.out.println(group);
}
}
}