java正则表达式对一些特殊字符匹配的理解

Posted 软件猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java正则表达式对一些特殊字符匹配的理解相关的知识,希望对你有一定的参考价值。

public static void match(String str)
		//特殊字符在正则和字符串中都要转义,但是转义的方式不太相同
		//正则表达式中,\\\\\\\\为一个\\;而字符串String中,\\\\表示一个\\
		//正则表达式中,*,.,+,?,()等特殊字符需要两个斜杠加特殊字符表示,比如\\\\*表示一个*,而字符串中直接输入即可
		//正则表达式中,\\W,\\d,D,\\w等都需要双斜杠,比如\\\\w,\\\\W等,而制表符等表示空字符串的不需要
		String pattern="\\\\\\\\\\\\*\\\\w+\\\\*/";
		System.out.println(pattern);
		
		System.out.println(str);
		System.out.println(Pattern.matches(pattern, str));
	
	
	public static void main(String[] args)   
		Scanner in = new Scanner(System.in);
		while(in.hasNext())
			String str = in.nextLine();
			match(str);
		
      

这是我自己练习的内容,输入的字符串是这样的: \\*abcd*/,凡是这种类似的字符串都会被匹配成功,关键的解释在代码注释中已经有了。写在这里帮助理解。


简单的解释一下,首先你要记住一点,正则表达式比较特殊,\\\\表示的是一个正则表达式的反斜线,而不是一个反斜线字符。或者说,\\\\\\\\四个反斜线才表示字符串中的两个反斜线\\\\,也就是要输出的一个反斜线\\。

“\\\\\\\\\\\\*\\\\w+\\\\*/”为什么要这样写呢?我们一点一点的来看,首先是前四个反斜线\\\\\\\\,这个在正则表达式中表示一个反斜线\\,而在字符串中表示两个反斜线\\\\。

接下来是\\\\*这个在正则表示的是一个*(因为*在正则中单独出现表示一个字符,需要一个转义也就是一个\\,而这个\\在正则中必须由两个\\\\来表示)。

\\\\w+表示一个或者多个字母,这个也是一样的道理,注意是双反斜线。

\\\\*表示一个*

/没有特殊含义,不需要转义

补充一点吧,也是看了这篇文章受到的启发http://blog.csdn.net/yaerfeng/article/details/28855587#reg3、

补充的内容是这样的,我们把regex和要匹配的字符串都通过控制台输入,那么输入的规则是啥呢?

public static void main(String[] args) 
		Scanner in = new Scanner(System.in);
		while (true) 
			// String str = in.nextLine();
			// match(str);
			try 
				System.out.println("Enter your regex:");
				Pattern pattern = Pattern.compile(in.nextLine());
				System.out.println("Enter input string to search:");
				Matcher matcher = pattern.matcher(in.nextLine());
				boolean found = false;
				while (matcher.find()) 
					System.out.println("I found the text \\"" + matcher.group() + "\\" starting at index"
							+ matcher.start() + " and ending at index " + matcher.end());
					found = true;
				

				if (!found) 
					System.out.println("No match found");
				
			 catch (Exception e) 
				e.printStackTrace();
			
		
	

代码很简单,只需要随便阅读以下即可,关键是几个输入的规则,regres的输入必须要满足什么条件呢?必须要满足普通String的条件,也就是说必须要转义,但是转义的规则不能是正则的规则,而是String的规则,相当于弱化了一层(正则强于String强于正常的输出),而普通的string输入呢?就按照你想匹配的文字输入即可。

再补充一句吧,对于^开头匹配和$结尾匹配,匹配的是一句话的完整的开头和结尾,而如果没有,^,可以从中间开始匹配;如果没有$,可以不用匹配到结尾,如果二者都没有,那就可能会有好多匹配的结果了,所以使用了matcher.find()啊。


以上是关于java正则表达式对一些特殊字符匹配的理解的主要内容,如果未能解决你的问题,请参考以下文章

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

求一个匹配 以指定字符开头,指定字符结尾,中间内容任意的正则表达式

java的正则表达

正则中需要转义的特殊字符小结

如果模式以 ; 结尾,则 Java 正则表达式匹配字符串或者啥都没有[重复]