正则表达式零宽断言

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

/**
 * 	正则表达式工具类
 */
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|food" 匹配 z或者food"(z|f)ood" 匹配 zood 或者 food
[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|ies) 匹配 industry 和 industries
(?=pattern) 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。 Windows (?=95|98|NT|2000) 匹配 “Windows 2000” 中的 Windows ; 不匹配 "Windows 3.1"中的 Windows

例子

例子01

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

例子

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)$

校验字符的表达式

相关推荐

  1. 表达式断言

    2023-12-19 06:58:04       53 阅读
  2. 表达式断言

    2023-12-19 06:58:04       72 阅读
  3. 基础学python:19、 表达式

    2023-12-19 06:58:04       37 阅读
  4. 表达式预查寻也称断言,限定左右相邻内容

    2023-12-19 06:58:04       53 阅读
  5. 表达式

    2023-12-19 06:58:04       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-19 06:58:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-19 06:58:04       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-19 06:58:04       82 阅读
  4. Python语言-面向对象

    2023-12-19 06:58:04       91 阅读

热门阅读

  1. 鸿蒙OS应用开发之正则表达式检查

    2023-12-19 06:58:04       59 阅读
  2. 静态独享专线IP怎么设置?使用静态IP怎么上网

    2023-12-19 06:58:04       72 阅读
  3. 金和OA jc6 clobfield SQL注入漏洞复现

    2023-12-19 06:58:04       118 阅读
  4. 低成本SDR平台的构成与开发

    2023-12-19 06:58:04       70 阅读
  5. Redis 实现全局唯一ID

    2023-12-19 06:58:04       58 阅读
  6. 基于RBAC的k8s集群权限管控案例

    2023-12-19 06:58:04       49 阅读
  7. 【期末复习向】文本理解与数据挖掘-名词解释

    2023-12-19 06:58:04       60 阅读
  8. SGML .HTML 、XML和XHTML的区别?

    2023-12-19 06:58:04       59 阅读
  9. webpack总结

    2023-12-19 06:58:04       63 阅读
  10. Cmake基础(7)

    2023-12-19 06:58:04       46 阅读