`
roway
  • 浏览: 50347 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Regex 量词Quantifier 分组group

阅读更多

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

    - **分组与引用**:使用括号`()`创建分组,可以通过`\数字`引用前面的分组。 - **选择与否定**:`|`表示或操作,`[^字符集]`表示否定字符集,匹配不在集合内的字符。 通过熟练掌握这些基本概念和`regex101`工具的...

    regex.h regex.cpp

    在本案例中,"regex.h" 和 "regex.cpp" 是两个关键文件,它们分别代表了C语言中处理正则表达式的头文件和源文件。 `regex.h` 头文件是C语言中使用正则表达式的关键接口,它包含了所有与正则表达式相关的函数声明和...

    regex match tracer

    - 检查量词、分组、选择符等操作对匹配的影响。 - 对照学习正则表达式语法,加深理解。 ### 4. 学习正则表达式的建议 - 熟悉基本语法:了解各个字符和特殊符号的作用,这是使用Regex Match Tracer的基础。 - 练习...

    RegexTester 正则表达式测试器

    正则表达式由元字符、字符类、量词和分组等元素组成,通过这些元素的组合,可以构建出强大的模式匹配规则。 RegexTester的主要功能包括: 1. **匹配测试**:用户输入正则表达式和目标文本,RegexTester会高亮显示...

    Regex Match Tracer 正则表达式 测试工具

    通过使用各种元字符、量词、分组和分支等构造,正则表达式可以实现复杂的数据匹配规则。然而,正则表达式的语法相对复杂,有时很难一眼看出其匹配逻辑。这就是Regex Match Tracer发挥作用的地方。 Regex Match ...

    正则表达式(regex)C语言源码,超强查找/替换算法

    它支持多种正则表达式语法,包括基本的字符匹配、量词、分组、预查以及更多的高级特性。由于它是纯C代码,因此可以方便地移植到各种操作系统和硬件平台。 **2. C语言与正则表达式** 在C语言中,没有内置的正则...

    RegexTester.exe

    、\、|、( )、[ ]、{ }、\d、\D、\w、\W等)以及量词、分组、选择、预查等概念,都需要深入理解。同时,了解如何在RegexTester.exe这样的工具中有效地利用这些特性,能够帮助开发者避免因正则表达式错误导致的程序...

    正则表达式工具(检测_保存) RegExr.rar

    3. **功能完备**:RegExr包含了丰富的元字符、预定义字符类、量词、分组、捕获、非捕获、反向引用、零宽断言等正则表达式元素,以及它们的使用方法和示例,帮助用户全面掌握正则表达式语法。 4. **学习资源**:...

    Regex Tester

    - **基本元素**:包括字符匹配(如字母、数字)、特殊字符(如`.`匹配任何字符,`^`表示开始,`$`表示结束)和量词(如`*`表示零个或多个,`+`表示一个或多个,`?`表示零个或一个)。 - **分组**:使用`()`将部分...

    libboost_regex.zip

    PCRE模式允许开发者使用复杂的正则表达式语法,包括字符类、量词、分组、分支选择和后向引用等。通过libboost_regex,我们可以轻松地在C++程序中执行这些高级操作。 在Windows环境中使用libboost_regex,需要正确...

    regex

    正则表达式(Regex)是一种强大的文本处理工具,...对于初学者来说,了解元字符、量词和分组是入门的关键,而熟练运用则需要不断地实践和调试。通过RegexTest.exe这样的工具,你可以更好地理解和改进你的正则表达式。

    RegexTester 正则表达式工具及教程

    3. **分组与捕获**:RegexTester 可以显示分组匹配的结果,这对于处理复杂的正则表达式非常有用。分组允许用户在表达式中定义子模式,并捕获这些子模式的匹配内容。 4. **反向查找**:提供反向查找功能,可以查找不...

    regex正则表达式入门

    正则表达式(Regex)是计算机编程中一种强大的文本处理工具,用于匹配、查找、替换或提取符合特定模式的字符串。在本入门资料中,我们将深入理解正则表达式的基本概念,掌握其核心语法,并通过实例来提升实战能力。 ...

    regex++ document (boost)

    1. 正则表达式语法:包括字符类(如.`[a-z]`表示小写字母)、量词(如`*`表示零个或多个前面的字符)、分组(如`(abc)`)、锚点(如`^`表示行首,`$`表示行尾)等。 2. 编译与匹配:`regex++`库提供了编译正则...

    正则表达式 测试 工具Regex Testor

    你可以位该regex添加描述分组,该信息会在程序结束后保存在CustomPatternInfo.ini文件中。 c.可以参考Readme_1.jpq和Readme_2.jpq图片介绍。 3.有待改进 a.界面布局和控件友好型和交互性。 b.界面功能提供...

    linux下的C语言POSIX正则表达式头文件和源文件: regex.h regex.cpp

    POSIX正则表达式提供了丰富的元字符和操作符,例如`.`(匹配任意字符)、`*`(重复前面的字符零次或多次)、`^`(匹配行首)和`$`(匹配行尾),以及括号分组、反向引用等高级特性,极大地增强了文本处理的能力。...

    Cpp regex usge demo

    除了这些基本操作,C++的正则表达式库还提供了丰富的元字符和预定义字符类,如`.`(匹配任意字符,除了换行符)、`^`(匹配行首)、`$`(匹配行尾)、`[]`(字符集)等,以及量词如`*`、`?`、`+`、`{n}`、`{n,}`和`{...

    GNU regex windows编译

    - **分组与反向引用**:通过`( )`进行分组,允许你对子模式进行操作,并可以使用`\数字`进行反向引用。 - **选择与否定前瞻**:`|`用于选择两个或多个模式,`(?=pattern)`和`(?!pattern)`分别表示肯定前瞻和否定前瞻...

    C++Regex正则表达式

    3. **量词**:如 `*`(零次或多次)、`+`(一次或多次)、`?`(零次或一次)、`{n}`(恰好n次)、`{n,}`(至少n次)等,控制匹配次数。 4. **分组与捕获**:`(pattern)` 用于创建一个分组,可以捕获和引用。 5. **...

Global site tag (gtag.js) - Google Analytics