Java正则表达式

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);
		}
	}
}

from: Java正则表达式小记_-柚子皮-的博客-CSDN博客

ref: Java的java.util.regex包

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值