1.量词Quantifier
a.作用:限定之前的字符出现的次数
b.形式:
1.*:之前的字符可以出现0次到无穷多次。
2.+:之前的字符至少需要出现1次。
3.?:之前的字符至多只能出现1次。
2.区间量词
a.作用:具体规定字符的出现次数
b.形式:
1.{min,max}
2.{min, }
3.{number}
4.*={0,}
5.+={1,}
6.?={0,1}
7.用\\d+验证数字字符串。
3.量词的局限
a.量词只能规定之前字符或字符组的出现次数
b.如果要规定一个字符串的出现次数,必须使用括号(...),在括号内填写字符串,在闭括号之后添加量词。
4.括号的用途:多选结构
a.字符组(这就是字符组[1234567890])只能表示某个位置可能出现的单个字符,而不能表示某个位置可能出现的字符串。
b.作用:表示某个位置可能出现的字符串
c.形式:
1.(...|...),在竖线两端添加各个字符串
2.(...|...|...|...)
5.括号的用途:捕获分组
a.作用:将括号内的子表达式捕获的字符串存放到匹配结果中,供匹配完成后访问
b.形式:使用普通的括号(...)
/**
* 括号的用途:捕获分组
* */
public class CaptureBasic {
public static void main(String[] args) {
String email = "webmaster@itcast.net";
String regex = "(\\w+)@([\\w.]+)";
//String regex = "(\\w+)@([\\w]+.[\\w]+)";//比较一下这种情况
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(email);
if (m.find()) {
//组零表示整个模式,因此表达式 m.group(0) 等效于 m.group()。
System.out.println("email add is:\t" + m.group(0));
System.out.println("username is:\t" + m.group(1));
System.out.println("hostname is:\t" + m.group(2));
//System.out.println("exception is:\t" + m.group(3));
}
}
}
6.捕获分组的注意事项
a.只要使用了括号,就存在捕获分组
b.捕获分组按照开括号出现的从左至右的顺序编号,遇到括号嵌套的情况也是如此。
c.如果捕获分组之后存在量词,则匹配结果中,捕获分组保存的是子表达式最后一次匹配的字符串。------注意掌握!
/**
* 组的使用......掌握!!!
* */
public class CaptureMind {
public static void main(String[] args) {
explainGroupNo();
System.out.println("");
explainGroupQuantifier();
}
/**
* 第一个左括号是第一组...依此类推。
* */
public static void explainGroupNo() {
String email = "webmaster@itcast.net";
String regex = "((\\w+)@([\\w.]+))";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(email);
if (m.find()) {
System.out.println("match result:\t" + m.group(0));
System.out.println("group No.1 is:\t" + m.group(1));
System.out.println("group No.2 is:\t" + m.group(2));
System.out.println("group No.3 is:\t" + m.group(3));
}
}
/**
* 与上面方法中正则表达式的区别<br>
* 如果捕获分组之后存在量词,则匹配结果中,捕获分组保存的是子表达式最后一次匹配的字符串。------注意掌握!
* */
public static void explainGroupQuantifier() {
String email = "webmaster@itcast.net";
String regex = "(\\w)+@([\\w.])+";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(email);
if (m.find()) {
System.out.println("match result:\t" + m.group(0));
System.out.println("group No.1 is:\t" + m.group(1));
System.out.println("group No.2 is:\t" + m.group(2));
}
}
}
7.不捕获文本的括号
a.如果正则表达式很复杂,或者需要处理的文本很长,捕获分组会降低效率。
b.作用:仅仅用来对表达式分组,而不把分组捕获的文本存入结果。
c.形式:(?:...)
/**
* 不捕获文本的括号,形式:(?:...)------掌握!!!
* */
public class NoCaptureParenthese {
public static void main(String[] args) {
String email = "webmaster@itcast.net";
String regex = "(?:webmaster|admin)@(itcast.net)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(email);
if (m.find()) {
System.out.println("match result:\t" + m.group(0));
System.out.println("group No.1 is:\t" + m.group(1));
}
}
}
8.括号的用途:反向引用
a.作用:在表达式的某一部分,动态重复之前的子表达式所匹配的文本。
b.形式:\1
/**
*括号的用途:反向引用
*a.作用:在表达式的某一部分,动态重复之前的子表达式所匹配的文本。
*b.形式:\1
* */
public class BackReferenceBasic {
public static void main(String[] args) {
String[] strings = new String[] { "<h1>good</h1>", "<h1>bad</h2>"};
String regex = "<(\\w+)>[^<]+</(\\1)>";//掌握!!!
for (String str : strings) {
if (str.matches(regex)) {
System.out.println("\"" + str
+ "\" can be matched with regex \"" + regex
+ "\"");
} else {
System.out.println("\"" + str
+ "\" can not be matched with regex \"" + regex
+ "\"");
}
}
}
}
研究下面一个问题:
public class BackReferenceReplace {
public static void main(String[] args) {
String dupWords = "word word";
String dupWordRegex = "(\\w+)\\s+(\\1)";
//以下两行是扩充的代码
//String dupWords = "word word word word";
//String dupWordRegex = "(\\w+)(\\s+(\\1))+";
System.out.println("Before replace:\t" + dupWords);
//根据java语句的规范,"$1"表示的是正则表达式中编号为1的分组所捕获的字符串......理解!!!
System.out.println("After replace:\t"
+ dupWords.replaceAll(dupWordRegex, "$1"));
}
}
分享到:
相关推荐
- **分组与引用**:使用括号`()`创建分组,可以通过`\数字`引用前面的分组。 - **选择与否定**:`|`表示或操作,`[^字符集]`表示否定字符集,匹配不在集合内的字符。 通过熟练掌握这些基本概念和`regex101`工具的...
在本案例中,"regex.h" 和 "regex.cpp" 是两个关键文件,它们分别代表了C语言中处理正则表达式的头文件和源文件。 `regex.h` 头文件是C语言中使用正则表达式的关键接口,它包含了所有与正则表达式相关的函数声明和...
- 检查量词、分组、选择符等操作对匹配的影响。 - 对照学习正则表达式语法,加深理解。 ### 4. 学习正则表达式的建议 - 熟悉基本语法:了解各个字符和特殊符号的作用,这是使用Regex Match Tracer的基础。 - 练习...
正则表达式由元字符、字符类、量词和分组等元素组成,通过这些元素的组合,可以构建出强大的模式匹配规则。 RegexTester的主要功能包括: 1. **匹配测试**:用户输入正则表达式和目标文本,RegexTester会高亮显示...
通过使用各种元字符、量词、分组和分支等构造,正则表达式可以实现复杂的数据匹配规则。然而,正则表达式的语法相对复杂,有时很难一眼看出其匹配逻辑。这就是Regex Match Tracer发挥作用的地方。 Regex Match ...
它支持多种正则表达式语法,包括基本的字符匹配、量词、分组、预查以及更多的高级特性。由于它是纯C代码,因此可以方便地移植到各种操作系统和硬件平台。 **2. C语言与正则表达式** 在C语言中,没有内置的正则...
、\、|、( )、[ ]、{ }、\d、\D、\w、\W等)以及量词、分组、选择、预查等概念,都需要深入理解。同时,了解如何在RegexTester.exe这样的工具中有效地利用这些特性,能够帮助开发者避免因正则表达式错误导致的程序...
3. **功能完备**:RegExr包含了丰富的元字符、预定义字符类、量词、分组、捕获、非捕获、反向引用、零宽断言等正则表达式元素,以及它们的使用方法和示例,帮助用户全面掌握正则表达式语法。 4. **学习资源**:...
- **基本元素**:包括字符匹配(如字母、数字)、特殊字符(如`.`匹配任何字符,`^`表示开始,`$`表示结束)和量词(如`*`表示零个或多个,`+`表示一个或多个,`?`表示零个或一个)。 - **分组**:使用`()`将部分...
PCRE模式允许开发者使用复杂的正则表达式语法,包括字符类、量词、分组、分支选择和后向引用等。通过libboost_regex,我们可以轻松地在C++程序中执行这些高级操作。 在Windows环境中使用libboost_regex,需要正确...
正则表达式(Regex)是一种强大的文本处理工具,...对于初学者来说,了解元字符、量词和分组是入门的关键,而熟练运用则需要不断地实践和调试。通过RegexTest.exe这样的工具,你可以更好地理解和改进你的正则表达式。
3. **分组与捕获**:RegexTester 可以显示分组匹配的结果,这对于处理复杂的正则表达式非常有用。分组允许用户在表达式中定义子模式,并捕获这些子模式的匹配内容。 4. **反向查找**:提供反向查找功能,可以查找不...
正则表达式(Regex)是计算机编程中一种强大的文本处理工具,用于匹配、查找、替换或提取符合特定模式的字符串。在本入门资料中,我们将深入理解正则表达式的基本概念,掌握其核心语法,并通过实例来提升实战能力。 ...
1. 正则表达式语法:包括字符类(如.`[a-z]`表示小写字母)、量词(如`*`表示零个或多个前面的字符)、分组(如`(abc)`)、锚点(如`^`表示行首,`$`表示行尾)等。 2. 编译与匹配:`regex++`库提供了编译正则...
你可以位该regex添加描述分组,该信息会在程序结束后保存在CustomPatternInfo.ini文件中。 c.可以参考Readme_1.jpq和Readme_2.jpq图片介绍。 3.有待改进 a.界面布局和控件友好型和交互性。 b.界面功能提供...
POSIX正则表达式提供了丰富的元字符和操作符,例如`.`(匹配任意字符)、`*`(重复前面的字符零次或多次)、`^`(匹配行首)和`$`(匹配行尾),以及括号分组、反向引用等高级特性,极大地增强了文本处理的能力。...
除了这些基本操作,C++的正则表达式库还提供了丰富的元字符和预定义字符类,如`.`(匹配任意字符,除了换行符)、`^`(匹配行首)、`$`(匹配行尾)、`[]`(字符集)等,以及量词如`*`、`?`、`+`、`{n}`、`{n,}`和`{...
- **分组与反向引用**:通过`( )`进行分组,允许你对子模式进行操作,并可以使用`\数字`进行反向引用。 - **选择与否定前瞻**:`|`用于选择两个或多个模式,`(?=pattern)`和`(?!pattern)`分别表示肯定前瞻和否定前瞻...
3. **量词**:如 `*`(零次或多次)、`+`(一次或多次)、`?`(零次或一次)、`{n}`(恰好n次)、`{n,}`(至少n次)等,控制匹配次数。 4. **分组与捕获**:`(pattern)` 用于创建一个分组,可以捕获和引用。 5. **...