`
isiqi
  • 浏览: 16496819 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Java 正则中的(.*?)vs(.*)

 
阅读更多

@author YHC

public static void main(String[] args) {

        //选择最小和最大重复次数
		String a="{user=\"administrator\",password=\"root\"}";
		String b="user   =\"a\"";//注意=号之间有空格
		String c="user\r\n=\"c\"";//注意有换行符号
		
		//获取双引号之间的内容,分别获得a,b,c中的所有的用户的名称
		String regex="(?s)user.*?=(\".*?\")";
		match(regex,a);//user="administrator"
		match(regex,b);//user   ="a"
		match(regex,c);//user
                       //="c"
		
		//上面的非常简单,注意以下事例
		//选择最小和最大重复数
		//注意以下几点,user =这个之间可能有空格
		//我们需要的结果是找出user='xxx'的信息,其余不要
		String notice="[{user='admin',password='admin'}," +
				       "{user='yhc',password='yhc'}]";
		//也许大家会觉得.*?为什么需要?号,那么一下我们看看
		//有?和没有?的区别
		String regex1="user.*='(.*?)'";//user.*=之间没有?
		match(regex1, notice);
		//输出结果(错误):user='admin',password='admin'},{user='yhc',password='yhc'
		
		String regex2="user.*?='(.*?)'";//user.*=之间有?
		match(regex2, notice);
		//输出结果(正确):
		//user='admin'
		//user='yhc'
		
		//为什么上面就因为一个?号而有这么大的区别咧?
		//解释以上代码运行机制
		//有了匹配文本中的第一个user之后,引擎就会到达(.*),其中点号(.)可以
		//匹配任意字符,其中包括换行符,星号(*)则把它重复0次或更多次,请注意,
		//这里的星号(*)是贪心的,因此点星(.*)会匹配直到目标文件结束的所有的
		//内容,注意=====>>>>(.*)会吃了所有的目标文件内容,从第一个匹配
		//user的地方开始;
		
		//当(.*)把肚子吃饱之后,引擎才会试图去匹配在目标文本末尾的=
		//这个表达式,当然,一定会匹配失败,但这并不会代表此次匹配就结束了,
		//正则引擎会进行回溯backtrack,当匹配某一个位置之后
		//,正则表达式都会保存一个回溯位置,如果正则表达式匹配之后的文本失败后
		//那么正则引擎还可以回到这些位置
		//当=匹配匹配失败之后,引擎进行回溯,让(.*)放弃它的匹配中的一个
		//字符接着=会被再次尝试匹配,这次在文本中的最后一个字符的位置,
		//如果依然失败的话,那么引擎会再一次进行回溯在文件的倒数第2个字符出尝试匹配
		//这个过程会一直继续,直到=匹配成功位置,如果一直没有匹配成功,那么最终(.*)
		//会用完所有的回溯位置,然后正则匹配失败
		
		//如果在整个回溯的过程中=在某个点匹配成功,那么就会接着尝试匹配'如果'匹配
		//失败,引擎接着进行回溯,这个过程会一直重复,直到='(.*?)'可以被匹配为止
		
		//问题就出现在.*上,因为星号是贪心的,所以你们要注意哦!
		//我们需要使用lazy 懒惰 可以在后面放一个?使其变为懒惰
		//例如:(*?),(+?),(??) ,{1,100}? 都可以将其变为懒惰	
		
	}
	
	public static void match(String regex,String input){
		    //创建正则对象
       		Pattern pattern=Pattern.compile(regex);
       		//匹配对象
       		Matcher matcher=pattern.matcher(input);
       		//输出匹配字符串
       		while(matcher.find()){
       			System.out.println(matcher.group());
       		}
	}

如果以上有写错误的地方,请大家指出,thanks!

分享到:
评论

相关推荐

    java正则表达式.zip

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于模式匹配的概念,能够高效地进行文本搜索、替换和解析。在Java中,正则表达式主要通过`java.util.regex`包来实现,提供了Pattern和Matcher两个核心...

    正则表达式中的 .*? 或 .*+ 的意思

    正则表达式是编程语言中不可或缺的一部分,它用于处理字符串,执行复杂的查找、替换和提取操作。在正则表达式中,`.` 是一个特殊字符,代表任何非换行符的字符,而 `*` 和 `+` 是量词,它们控制前一个字符或字符集的...

    Java正则表达式.ppt

    Java正则表达式是一种强大的文本处理工具,广泛用于验证字符串、查找特定模式和替换文本。在Java中,正则表达式提供了简洁而灵活的方式来处理字符串,使得编程人员能够以更高效的方式实现各种文本操作。 正则表达式...

    java正则表达式.pdf

    ### Java正则表达式详解 #### 一、引言 正则表达式是计算机科学中的一个强大工具,用于处理文本数据。随着Java的发展,自J2SE 1.4版本开始,Java正式引入了对正则表达式的支持,并提供了一系列功能强大的API。本文...

    解析正则表达式中的.*,.*?,.+?的含义

    正则表达式是用于字符串匹配的工具,广泛应用于编程语言和文本处理工具中。本文将深入探讨正则表达式中的三个特殊元字符序列:`.*`、`.*?`和`.+?`的含义和用法。 首先,`.`(点)在正则表达式中代表匹配除换行符`\n...

    常用正则表达式******

    ### 常用正则表达式详解 #### 匹配中文字符 - **正则表达式**: `[\u4e00-\u9fa5]` - **应用场景**: - 文本处理与分析。 - 数据清洗时,用于识别并处理中文文本中的特定字符。 - **特点**: - `\u4e00` 至 `\u9fa5...

    Java常用正则表达式.txt

    ### Java常用正则表达式详解 #### 匹配腾讯QQ号 **正则表达式:** [1-9][0-9]{4,} **评注:** 腾讯QQ号从10000开始。 - **解析:** 此表达式确保了QQ号的第一个数字必须是非零数字(即1到9之间的任意一个),接着...

    JAVA的正则表达式.doc

    以下是对Java正则表达式的关键知识点的详细解释: 1. **英文句点符号**:`.` 代表任意单个字符,除了换行符。例如,表达式 "t.o" 可以匹配 "tno","t#o","teo" 等,但不能匹配 "tnno","to" 或 "Tno"。 2. **方...

    java正则表达式.doc

    Java正则表达式是Java编程语言中用于处理字符串的强大工具,它基于Perl 5正则表达式语法。在Java中,正则表达式用于模式匹配、字符串分割、替换等任务,极大地提升了文本处理的效率。以下是对正则表达式基础知识的...

    正则表达式.rar正则表达式.rar正则表达式.rar正则表达式.rar正则表达式.rar

    9. **在不同编程语言中的实现**:不同的编程语言对正则表达式的支持程度和实现可能略有差异,例如JavaScript、Python、Java、Perl等都有自己的正则表达式引擎和语法特性。 正则表达式的强大在于其灵活性和可组合性...

    java正则表达式.txt

    从给定的文件信息中,我们可以提取到一系列与Java正则表达式相关的知识点,这些正则表达式主要用于匹配和验证各种格式的字符串。下面将详细解释每个正则表达式的功能和应用场景。 ### 正则表达式知识点 1. **数字...

    java 正则匹配所有 {},并取出所有符合的字符串。

    在Java编程语言中,正则表达式是一种强大的文本处理工具,可以用来匹配、查找、替换和解析字符串。这里我们关注的是如何使用正则表达式来匹配所有包含在花括号 `{}` 中的字符串,并将其提取出来。这在处理模板引擎、...

    java正则表达式.docx

    总的来说,掌握Java正则表达式对于任何Java开发者来说都是必不可少的技能,无论是在日常开发中处理文本,还是在调试和测试过程中进行复杂的数据验证,正则表达式都能提供强大的支持。通过深入学习和实践,你可以更加...

    java正则与程序优化

    Java正则表达式是编程语言中的一个重要工具,用于文本处理和模式匹配。它在Java中通过Pattern和Matcher类实现,提供了强大的字符串分析功能。程序优化则是提升代码性能的关键环节,涉及算法选择、内存管理、计算效率...

    常用正则表达式.rar

    在编程语言如C#和Java中,正则表达式是一个强大的工具,能帮助开发者高效地处理字符串操作。本压缩包"常用正则表达式.rar"提供了一些常见的正则表达式示例,主要包括校验数字、字符以及满足特殊需求的表达式。 1. *...

    java基本正则表达式.zip

    java基本正则表达式.zipjava基本正则表达式.zipjava基本正则表达式.zipjava基本正则表达式.zipjava基本正则表达式.zipjava基本正则表达式.zipjava基本正则表达式.zip

Global site tag (gtag.js) - Google Analytics