本文主要是介绍正则表达式零宽断言,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
正则表达式零宽断言
- 工具类,正则表达式匹配文本内容
- 正则表达式语法
- 例子
- 例子01
- 零宽断言
- ?<= 不包含左边值
- ?= 不包含右边值
- 例子
- 常用正则表达式
- 校验数字的表达式
- 校验字符的表达式
工具类,正则表达式匹配文本内容
/*** 正则表达式工具类*/
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 {@Testpublic 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"});}@Testpublic 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"});}@Testpublic 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"});}@Testpublic 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)$ |
校验字符的表达式
这篇关于正则表达式零宽断言的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!