对于这三种匹配模式也有叫: “
最大匹配Greedy
”“
最小匹配Reluctant
”“
完全匹配Possessive
”。现在将我对这三种匹配模式的理解写出来,并提供一些例子供大家参考。
1、Greediness(贪婪型): 最大匹配
X?、X*、X+、X{n,}都是最大匹配。例如你要用“<.+>”去匹配“
a<tr>aava </tr>abb
”,也许你所期待的结果是想匹配“”,但是实际结果却会匹配到“
<tr>aava </tr>
”。这是为什么呢?下面我们跟踪下最大匹配的匹配过程。
①“<”匹配字符串的“<”。②“.+”匹配字符串的“
<tr>aava </tr>ab
”,在进行最大匹配时,它把两个“>”都匹配了,它匹配了所有字符,直到文本的最后字符“b” ③这时,发现不能成功匹配“>”,开始按原路回退,用“a”与“>”匹配,直到“ab”前面的“>”匹配成功。
这就是最大匹配,我们匹配的时候应该看最后面能匹配到哪。
代码示例:
String test = "a<tr>aava </tr>abb "
String reg = "<.+>"
System.out.println(test.replaceAll(reg, "###"))
a###abb
2、Reluctant(Laziness)(勉强型):最小匹配
X?、X*、X+、X{n,}都是最大匹配。好,加个?就成了Laziness匹配。例如X??、X*?、X+?、X{n,}?都是最小匹配,其实X{n,m}?和X{n }?有些多余。
最小匹配意味者,.+? 匹配一个字符后,马上试一试>的匹配可能,失败了,则.+? 再匹配一个字符,再马上试一试>的匹配可能。JDK文档中Greedy 和 Reluctant,它是以eat一口来隐喻的,所以翻译成贪吃和(勉强的)厌食最贴切了。不过我喜欢最大匹配、最小匹配的说法。
代码示例:
String test = "a<tr>aava </tr>abb "
String reg = "<.+?>"
System.out.println(test.replaceAll(reg, "###"))
a###aava ###abb
和上面的不同是匹配了两处。
3、Possessive(占有型):完全匹配
与最大匹配不同,还有一种匹配形式:X?+、X*+、X++、X{n,}+等,成为完全匹配。它和最大匹配一样,一直匹配所有的字符,直到文本的最后,但它不由原路返回。也就是说,一口匹配,搞不定就算了,到也干脆,偶喜欢。
代码示例:
String test = "a<tr>aava </tr>abb "
String test2 = "<tr>"
String reg = "<.++>"
String reg2 = "<tr>"
System.out.println(test.replaceAll(reg, "###"))
System.out.println(test2.replaceAll(reg2, "###"))
a<tr>aava </tr>abb
可见。完全匹配是最严格的,必须整个字符串匹配才行。
正则匹配即是在给定字符串中查找符合正则表达式的字符。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则匹配常用类
正则匹配中常用的类为Pattern和Matcher类,前者表示匹配的模式串,后者表示匹配的结果。
常用的使用方法如下:
// 待查找字符
String fileName = "workspace/test.apk";
// 构建模式,其中compile方法还可以
*. 分组说匹配次数之前,先说说其他的。使用圆括号 ( ) 包裹字符内容,使其变成一个子表达式,执行匹配后,除了总匹配结果,子表达式匹配结果也会存入内存。这里括号的作用和四则运算中括号中的作用差不多,括号内的运算具有更高的优先级,并作为一个整体参与匹配运算。1.用元字符确定匹配次数通过在单个字符或一个子表达式的后方,紧跟表示匹配次数的元字符,确定这个字符或者子表达式应当连续匹配的次数。1. ?? ...
我遇到了这段代码的问题,特别是while循环中的代码 .public void mSetSafeCode() // Manually define safe passcode{int mIntPasscode;String mStringPasscode;Scanner sc = new Scanner(System.in);System.out.print("Enter your desired...
我试图找到一个字符串是否只包含一个单词,例如String : `jjdhfoobarfoo` , Regex : `foo` --> falseString : `wewwfobarfoo` , Regex : `foo` --> trueString : `jjfffoobarfo` , Regex : `foo` --> true多个foo可能发生在字符串中的任何地方,因此它...
对于这三种匹配模式也有叫:“最大匹配Greedy”“最小匹配Reluctant”“完全匹配Possessive”。现在将我对这三种匹配模式的理解写出来,并提供一些例子供大家参考。1、Greediness(贪婪型):最大匹配X?、X*、X+、X{n,}都是最大匹配。例如你要用“”去匹配“aaava abb”,也许你所期待的结果是想匹配“”,但是实际结果却会匹配到“aava”。这是为什么呢?下面我...
正则表达式(Regular Expression, RE),就是用某种模式去匹配一类字符串的一个公式,据说最初来源于人工智能理论。它现在被各种文本编辑软件、类库、脚本工具(awk/grep/sed)等广泛支持,而且Microsoft的工具也开始支持。前段时间使用这些脚本工具完成过一个数据库文本文件的格式处理工作,感觉到正则表达式实在是太强大的,这个思想其实完全可以应用于C语言的开发,已经有可用的R
在cdsc中的java版,有人提出这样的一个问题,即见原文:http://topic.csdn.net/u/20110913/21/b294d5c6-7a91-4a82-a139-a934398b32f3.html?54825这是为什么呢,.{3,10}表示,匹配任意的字符,至少匹配3次,但最多不超过10次,然后后面接一个 + ,最后表示有一个数字结尾。粗看起来,aaaa5bbbb6能够匹配,它可...
假定要分析的字符串是xfooxxxxxxfoo
模式.*foo (贪婪模式): 模式分为子模式p1(.*)和子模式p2(foo)两个部分. 其中p1中的量词匹配方式使用默认方式(贪婪型)。 匹配开始时,吃入所有字符xfooxxxxxx去匹配子模式p1。匹配成功,但这样以来就没有了字符串去匹配子模式p2。本轮匹配失败;第二轮:减少p1部分的匹配量,吐出最后一个字符, 把字符串分割成xfoo...
一、绪论:
在写程序的过程中,有时会需要匹配、查找、替换或者是判断字符串的出现情况,而且有时不能用简单的纯编码方式解决这些问题,这个时候就会想到要正则表达式,无论是Java, PHH, C#, Python, JavaScript, ActionScript, Perl等语言,都提高了强大的正则表达式支持,有的语言的精华就在于字符串处理功能比如Perl。