正则表达式零宽断言

正则表达式零宽断言

工具类,正则表达式匹配文本内容

java 复制代码
/**
 * 	正则表达式工具类
 */
public class RegexUtil {

	/**
	 * 	正则表达式匹配文本内容
	 * @param text	需要查找的内容
	 * @param regex	配置正则表达式
	 * @return	匹配到的内容列表
	 */
	public static List<String> getList(String text, String regex) {
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(text);
		List<String> list = new ArrayList<>();
		while (matcher.find()) {
			String group = matcher.group();
			list.add(group);
		}
		System.err.println(String.format("group=%s", list));
		return list;
	}

	/**
	 * 从文本中匹配正则表达式,匹配到的文本列表和目标列表进行对比
	 * @param text	需要查找的文本
	 * @param regex	正则表达式
	 * @param targetArr	目标列表
	 */
	public static void findAndCompare(String text, String regex, String[] targetArr) {
		List<String> list = RegexUtil.getList(text, regex);
		Assert.isTrue(list.equals(Arrays.asList(targetArr)), "两个List应该相等");
	}
}

正则表达式语法

字符 说明 例子
\ 将下一字符标记为特殊字符 \n 匹配 换行符\\ 匹配 \\\( 匹配 (
^ 匹配输入字符串开始的位置
$ 匹配输入字符串结尾的位置
-- --
-- --
x|y 匹配 x 或 y。 `"z
[xyz] 字符集。匹配包含的任一字符。 "[abc]"匹配"plain"中的"a"
[^xyz] 反向字符集。匹配未包含的任何字符。 "[^pla]"匹配"plain"中的 i和n
[a-z] 字符范围。匹配指定范围内的任何字符。
[^a-z] 反向范围字符。匹配不在指定的范围内的任何字符。
-- --
-- --
{n} n 是非负整数。正好匹配 n 次。 "zo{2}" 匹配 zoo `
{n,} n 是非负整数。至少匹配 n 次。 "zo{2,}" 匹配 zoo 、zooo、 zoooo 等 `
{n,m} m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。 "zo{2,3}" 匹配 zoo 、zooo `
-- --
-- --
* 零次或多次匹配前面的字符或子表达式 "zo*" 匹配 z、zo、zoo 等效于 zo{0,}
+ 一次或多次匹配前面的字符或子表达式 "zo+" 匹配 zo、zoo 等效于 zo{1,}
? 零次或一次匹配前面的字符或子表达式 "do(es)?" 匹配 do、does 等效于 do(es){0,1}
. 匹配除"\r\n"之外的任何单个字符。 若要匹配包括"\r\n"在内的任意字符,请使用诸如"[\s\S]"之类的模式。
-- --
-- --
\b 匹配一个字边界,即字与空格间的位置。
\B 非字边界匹配。
\d 数字字符匹配 等效于 [0-9]
\D 非数字字符匹配 等效于 [^0-9]
-- --
-- --
\cx 匹配 x 指示的控制字符。x 的值必须在 A-Z 或 a-z 之间。 \cM 匹配 Control-M 或回车符
\xn 匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。 "\x41"匹配"A""\x041""\x04"&"1"等效
\f 换页符匹配。 等效于 \x0c 和 \cL
\n 换行符匹配。 等效于 \x0a 和 \cJ
\r 回车符匹配。 等效于 \x0d 和 \cM
\t 制表符匹配。 等效于 \x09 和 \cI
\v 垂直制表符匹配。 等效于 \x0b 和 \cK
\s 任何空白字符匹配。 等效于 [ \f\n\r\t\v]
\S 任何非空白字符匹配。 等效于 [^\f\n\r\t\v]
\w 任何字类字符匹配。 等效于 [A-Za-z0-9_]
\W 任何非单词字符匹配。 等效于 [^A-Za-z0-9_]
-- --
-- --
(pattern) 匹配 pattern 并捕获该匹配的子表达式。
(?:pattern) 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。 `industr(?:y
(?=pattern) 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。 `Windows (?=95

例子

例子01

java 复制代码
public class RegexDemo01 {
	@Test
	public void test01() {
		// \ 将下一字符标记为特殊字符
		RegexUtil.findAndCompare("北京市(海定区)", "\\(", new String[] {"("});
		// ^ 匹配输入字符串开始的位置
		RegexUtil.findAndCompare("abc, add, add", "^a\\w+", new String[] {"abc"});
		// $ 匹配输入字符串结尾的位置
		RegexUtil.findAndCompare("abd, ddd, abd", "\\w+d$", new String[] {"abd"});
	}

	@Test
	public void test02() {
		// 匹配或者关系
		RegexUtil.findAndCompare("hello, z and food", "z|food", new String[] {"z", "food"});
		RegexUtil.findAndCompare("zood, z and food", "(z|f)ood", new String[] {"zood", "food"});
		// 字符集。匹配包含的任一字符。
		RegexUtil.findAndCompare("plain", "[abc]", new String[] {"a"});
		// (在[]中被当成普通字符
		RegexUtil.findAndCompare("plain (xzy)", "[ab(z)c]", new String[] {"a", "(", "z", ")"});
		// 字符集。匹配包含的任一字符。
		RegexUtil.findAndCompare("plain", "[^pla]", new String[] {"i", "n"});
	}

	@Test
	public void test03() {
		String text = "abc, zoooG, zoo, zoom!, bzoo!";
		// {n}	n 是非负整数。正好匹配 n 次
		RegexUtil.findAndCompare(text, "zo{3}", new String[] {"zooo"});
		// {n,}	n 是非负整数。至少匹配 n 次。
		RegexUtil.findAndCompare(text, "zo{2,}", new String[] {"zooo", "zoo", "zoo", "zoo"});
		// {n,m}	m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。
		RegexUtil.findAndCompare(text, "zo{3,4}", new String[] {"zooo"});
	}

	@Test
	public void test04() {
		String text = "abcz, zoy, zoooG, zoo, zoom!, bzoo!";
		// *	零次或多次匹配前面的字符或子表达式
		RegexUtil.findAndCompare(text, "zo*", new String[] {"z", "zo", "zooo", "zoo", "zoo", "zoo"});
		// +	一次或多次匹配前面的字符或子表达式
		RegexUtil.findAndCompare(text, "zo+", new String[] {"zo", "zooo", "zoo", "zoo", "zoo"});
		// ?	一次或多次匹配前面的字符或子表达式
		RegexUtil.findAndCompare(text, "zo(oo)?", new String[] {"zo", "zooo", "zo", "zo", "zo"});
	}
}

零宽断言

?<= 不包含左边值

(?<=exp) 也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp

例如:(?<=\bdanc)\w+\b 查找 I'm dancing,它会匹配 ing

?= 不包含右边值

(?=exp) 也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp

例如:"\b\w+(?=ing\b)" 查找 I'm dancing,它会匹配 danc

例子

java 复制代码
public class RegexDemo09 {

	@Test
	// 匹配 一个ing结尾的单词
	public void test01() {
		String text  = "Pingpong, I'm singing while you're dancing.";
		String regex  = "\\b\\w+(?=ing\\b)ing";
		RegexUtil.findAndCompare(text, regex, new String[] {"singing", "dancing"});
	}

	@Test
	// 匹配 一个sing开头的单词
	public void test02() {
		String text  = "Pingpong, I'm singing while you're dancing.";
		String regex  = "sing(?<=\\bsing)\\w+\\b";
		RegexUtil.findAndCompare(text, regex, new String[] {"singing"});
	}

	@Test
	// 匹配 ()里面的内容
	public void test03() {
		String text  = "北京市(海定区)(朝阳区)(西城区)";
		String regex  = "(?<=\\().*?(?=\\))";
		RegexUtil.findAndCompare(text, regex, new String[] {"海定区", "朝阳区", "西城区"});
	}

	@Test
	// 匹配 <string></string>里面的内容
	public void test04() {
		String text  = "<string>小帅</string>";
		String regex  = "(?<=\\<string\\>).*?(?=\\</string\\>)";
		RegexUtil.findAndCompare(text, regex, new String[] {"小帅"});
	}

	// @Test
	// 匹配 <string meta='xx'></string>里面的内容,string里面可以有不确定属性
	public void test05() {
		String text  = "<string>小帅</string> <>飞机<> <string meta='utf-8'>小妞</string>";
		String regex  = "(?<=\\<string\\b(\\w)\\b\\>).*?(?=\\</string\\>)";
		RegexUtil.findAndCompare(text, regex, new String[] {"小帅"});
	}
}

常用正则表达式

校验数字的表达式

描述 表达式
n位的数字 ^\d{n}$
至少n位的数字 ^\d{n,}$
m-n位的数字 ^\d{m,n}$
零和非零开头的数字 ^(0|[1-9][0-9]*)$
非零开头的最多带两位小数的数字 ^([1-9][0-9]*)+(.[0-9]{1,2})?$
带1-2位小数的正数或负数 ^(-)?\d+(.\d{1,2})$
正数、负数、和小数 ^(-|+)?\d+(.\d+)?$
有两位小数的正实数 2+(.[0-9]{2})?$
有1~3位小数的正实数 3+(.[0-9]{1,3})?$
非零的正整数 4\d* 或 \^(\[1-9\]\[0-9\]){1,3} 或 ^+?[1-9][0-9]$
非零的负整数 ^-[1-9][]0-9" 或 \^-\[1-9\]\\d
非负整数 ^\d+ 或 5\\d\*|0
非正整数 ^-[1-9]\d*|0 或 \^((-\\d+)|(0+))
非负浮点数 ^\d+(.\d+)? 或 6\\d\*.\\d\*|0.\\d\*\[1-9\]\\d\*|0?.0+|0
非正浮点数 ^((-\d+(.\d+)?)|(0+(.0+)?)) 或 \^(-(\[1-9\]\\d\*.\\d\*|0.\\d\*\[1-9\]\\d\*))|0?.0+|0
正浮点数 7\d*.\d*|0.\d*[1-9]\d* 或 \^((\[0-9\]+.\[0-9\]\[1-9\]\[0-9\])|(\[0-9\]\[1-9\]\[0-9\].\[0-9\]+)|(\[0-9\]\[1-9\]\[0-9\]))
负浮点数 ^-([1-9]\d*.\d*|0.\d*[1-9]\d*) 或 \^(-((\[0-9\]+.\[0-9\]\[1-9\]\[0-9\])|(\[0-9\]\[1-9\]\[0-9\].\[0-9\]+)|(\[0-9\]\[1-9\]\[0-9\])))
浮点数 ^(-?\d+)(.\d+)? 或 \^-?(\[1-9\]\\d\*.\\d\*|0.\\d\*\[1-9\]\\d\*|0?.0+|0)

校验字符的表达式

相关推荐
沙子迷了蜗牛眼21 小时前
当展示列表使用 URL.createObjectURL 的创建临时图片、视频无法加载问题
java·前端·javascript·vue.js
ganshenml21 小时前
【Android】 开发四角版本全解析:AS、AGP、Gradle 与 JDK 的配套关系
android·java·开发语言
我命由我1234521 小时前
Kotlin 运算符 - == 运算符与 === 运算符
android·java·开发语言·java-ee·kotlin·android studio·android-studio
小途软件21 小时前
ssm327校园二手交易平台的设计与实现+vue
java·人工智能·pytorch·python·深度学习·语言模型
alonewolf_9921 小时前
Java类加载机制深度解析:从双亲委派到热加载实战
java·开发语言
追梦者12321 小时前
springboot整合minio
java·spring boot·后端
云游21 小时前
Jaspersoft Studio community edition 7.0.3的应用
java·报表
帅气的你21 小时前
Spring Boot 集成 AOP 实现日志记录与接口权限校验
java·spring boot
zhglhy1 天前
Spring Data Slice使用指南
java·spring
win x1 天前
Redis 主从复制
java·数据库·redis