关于java正则表达式贪婪模式和勉强模式的研究
2013-10-26 15:06
716 查看
解释:
greedy :贪婪
reluctant:勉强,不情愿
java 正则表达式默认用的是greedy贪婪匹配模式既是这种类型(.*)的最长匹配,如果需要最短匹配则改为(.*?)即是勉强匹配模式。
原理分析:
如果是贪婪匹配模式,正则表达式引擎会一直匹配到字符串最后,当匹配为false时,通过
回溯的方式,倒退找到倒数第一个匹配位置,返回匹配结果
如果是勉强匹配模式,正则表达式引擎会匹配到符合pattern的末尾位置那个字符,然后再往后走一步,发现匹配为false,又回溯到找到回退的最近一个匹配为true的位置,返回结果。
看代码:
例一:
输出:
aaa"bbb"ccc"ddd"eee
aaa@eee
例二:
输出:
aaa"bbb"ccc"ddd"eee
aaa@ccc@eee
例三:
greedy :贪婪
reluctant:勉强,不情愿
java 正则表达式默认用的是greedy贪婪匹配模式既是这种类型(.*)的最长匹配,如果需要最短匹配则改为(.*?)即是勉强匹配模式。
原理分析:
如果是贪婪匹配模式,正则表达式引擎会一直匹配到字符串最后,当匹配为false时,通过
回溯的方式,倒退找到倒数第一个匹配位置,返回匹配结果
如果是勉强匹配模式,正则表达式引擎会匹配到符合pattern的末尾位置那个字符,然后再往后走一步,发现匹配为false,又回溯到找到回退的最近一个匹配为true的位置,返回结果。
看代码:
例一:
@Test public void test51(){ String str = "aaa\"bbb\"ccc\"ddd\"eee"; System.out.println(str); str = str.replaceAll("\"(.*)\"", "@"); System.out.println(str); }
输出:
aaa"bbb"ccc"ddd"eee
aaa@eee
例二:
@Test public void test52(){ String str = "aaa\"bbb\"ccc\"ddd\"eee"; System.out.println(str); str = str.replaceAll("\"(.*?)\"", "@"); System.out.println(str); }
输出:
aaa"bbb"ccc"ddd"eee
aaa@ccc@eee
例三:
@Test public void test7(){ // Greedy quantifiers String match = find("A.*c", "AbcAbc"); // AbcAbc System.out.println(match); match = find("A.+", "AbcAbc"); // AbcAbc System.out.println(match); // Nongreedy quantifiers match = find("A.*?c", "AbcAbc"); // Abc System.out.println(match); match = find("A.+?", "AbcAbc"); // Ab System.out.println(match); } public String find(String patternStr, CharSequence input) { Pattern pattern = Pattern.compile(patternStr); Matcher matcher = pattern.matcher(input); if (matcher.find()) { return matcher.group(); } return null; }
相关文章推荐
- Java-----正则表达式匹配模式[贪婪模式、勉强模式、占有模式]
- JAVA 正则表达式的三种模式: 贪婪, 勉强和占有的讨论
- [疯狂Java]正则表达式:Java正则表达式语法、贪婪模式/勉强模式
- 正则表达式的三种模式【贪婪、勉强、侵占】的分析
- php关于正则表达式贪婪模式与非贪婪
- 关于正则表达式的贪婪与非贪婪模式
- Java正则表达式学习 贪婪 勉强 侵占
- 正则表达式的三种模式【贪婪、勉强、侵占】的分析
- 关于正则表达式的贪婪与非贪婪模式
- 关于正则表达式的贪婪与非贪婪模式 - A JavaScript Fancier - IT博客网
- Java 正则表达式 非贪婪模式
- 关于java正则表达式非捕获型括号和捕获型括号的研究
- 正则表达式贪婪模式,单词边界 ,多行模式,子表达式(java版)
- Java正则表达式学习 贪婪 勉强 侵占
- 关于 Java 中 正则表达式的 MULTILINE 标志
- js中正则表达式的贪婪模式和非贪婪模式
- python中如何使用正则表达式的非贪婪模式示例
- java中正则匹配的贪婪模式和非贪婪模式
- 正则表达式,非贪婪模式
- 正则表达式之贪婪与非贪婪模式(II)