正则表达式

350 阅读2分钟

1、数量词

greedy(贪婪) Reluctant(懒惰) Possessive(独占)
X? X?? X?+
X* X*? X*+
X+ X+? X++
X{n} X{n}? X{n}+
X{n,m} X{n,m}? X{n,m}+

1.1、 回溯

  什么是回溯呢?发生回溯后,我们已经读取的字符串将被吐出去,指针回到上一个字符的位置。之后,程序读取正则表达式的下一个操作符 ,读取当前指针的下一个字符 进行对比。

2、数量词——greedy(贪婪) 模式

  • X?       X,一次或一次也没有
  • X*       X,零次或多次
  • X+       X,一次或多次
  • X{n}       X,恰好 n 次
  • X{n,}       X,至少 n 次
  • X{n,m}      X,至少 n 次,但是不超过 m 次

带有数量词的表达式操作符,会竭尽所能的匹配最多的字符,直到遇到匹配失败的字符,然后正则表达式操作符指针移到下一个操作符,去匹配当前不匹配的字符(这个过程叫 回溯)

3、数量词——Reluctant (懒惰) 模式

在数量词后面加上一个  "?", 就是输了匹配的懒惰模式

带有数量词次模式的每个正则表达式的操作符都会尽可能少的重复匹配字符,一旦操作符匹配成功一个字符,马上就会移到下一个正则表达式操作符去匹配。如果下一个表达式操作符不匹配当前字符指针的下一个字符,那么就会发生回溯,表达式操作符会回到上一个操作符来匹配

4、数量词——Possessive (独占) 模式

尽可能多的匹配,但不回溯

5. Matcher

  • matches 方法 整个字符串与模式匹配,完全匹配 true

  • lookingAt 方法 从字符串开头开始匹配,只要出现有与模式相匹配的字符串,就为true,而不必匹配到结尾整个字符串

  • find 在字符串中查找是否有与模式匹配的子字符串,不必从头开始,也不必匹配整个字符串

    /**
     * 从一个rtsp地址中提取IP地址
     * @param url rtsp地址
     * @return IP地址 or null
     */
    public static String matchIPfromRTSP(String url)
    {
        String _ipAddr = null;
    
        //rtsp://admin:@172.10.0.152:554/ch01.264?dev=1
    	Pattern pattern = Pattern.compile("[/@]((?:\\w+\\.)+\\w+)[/:]", Pattern.CASE_INSENSITIVE);
    
    	Matcher matcher = pattern.matcher(url);
    
    	//字符串中存在与模式匹配的sub字符串
    	if (matcher.find()) {
            _ipAddr = matcher.group(1);
    	}
    
        return _ipAddr;
    }
    

参考

正则表达式数量词 http://www.cnblogs.com/study-everyday/p/7426862.html 正则表达式引发的惨案