1. 程式人生 > >Java 正則表示式——貪婪匹配、惰性匹配、支配匹配

Java 正則表示式——貪婪匹配、惰性匹配、支配匹配

簡介

貪婪匹配

先看看整個字串是否存在匹配,如果未發現匹配,則去掉字串中的最後一個字元,再次嘗試匹配,如果還是未發現匹配再去掉最後一個字元,迴圈往復直到發現一個匹配或者字串不剩任何字串。

簡單量詞都是貪婪量詞。

惰性匹配

先看看字串的第一個字母是否存在匹配,如果未發現匹配,則讀入下一個字元,再次嘗試匹配,如果還是未發現匹配則再讀取下一個字元,迴圈往復直到發現一個匹配或者整個字串都檢查過也沒有發現匹配。

惰性匹配和貪婪匹配的工作方式正好相反。

支配匹配

只嘗試匹配整個字串。如果整個字串不匹配,則不做進一步。

意思就是隻做貪婪匹配的第一步。

舉個例子:”[email protected]

(1)當regex=”\[email protected]”的時候

經過第一次貪婪匹配,\w+匹配出的應該是”123456789”,然後再加上”@”,所以得出期望匹配到的字串為”[email protected]”。故匹配成功。

(2)當regex=”\w++3”的時候

經過第一次貪婪匹配,\w+匹配出的應該是”123456789”,然後再加上”3”,所以得出期望匹配到的字串為”1234567893”。故匹配失敗。

量詞區別

貪婪量詞 惰性量詞 支配量詞 描述
* *? *+ 可以不出現,也可以出現任意次
? ?? ?+ 可以出現0次或1次
+ +? ++ 至少出現1次或以上
{n} {n}? {n}+ 有且只能出現n次
{n,m} {n,m}? {n,m}+ 至少出現n次,至多出現m次
{n,} {n,}? {n,}+ 至少出現n次或以上

用法

    public static void main(String[] args) {
//      String appendStr = "m"; //["com", "com", null]
        String appendStr = "@"; //["
[email protected]
"
, "[email protected]", "[email protected]"] // String appendStr = "3"; //["123", "123", null] // String appendStr = ""; //[{"123456789","qq","com"}, {"1","2","3","4","5","6","7","8","9","q","q","c","o","m"}, {"123456789","qq","com"}]{"1","2","3","4","5","6","7","8","9","q","q","c","o","m"}, {"123456789","qq","com"}] String input = "[email protected]"; /** 貪婪匹配 */ String greedyMatchRegex = "\\w+" + appendStr; Pattern greedyMatchPattern = Pattern.compile(greedyMatchRegex); Matcher greedyMatcher = greedyMatchPattern.matcher(input); System.out.println("貪婪匹配"); while(greedyMatcher.find()) { System.out.println(greedyMatcher.group()); } /** 惰性匹配 */ String lazyMatchRegex = "\\w+?" + appendStr; Pattern lazyMatchPattern = Pattern.compile(lazyMatchRegex); Matcher lazyMatcher = lazyMatchPattern.matcher(input); System.out.println("惰性匹配"); while(lazyMatcher.find()) { System.out.println(lazyMatcher.group()); } /** 支配匹配 */ String dominantMatchRegex = "\\w++" + appendStr; Pattern dominantMatchPattern = Pattern.compile(dominantMatchRegex); Matcher dominantMatcher = dominantMatchPattern.matcher(input); System.out.println("支配匹配"); while(dominantMatcher.find()) { System.out.println(dominantMatcher.group()); } }

相關推薦

Java 表示式——貪婪匹配惰性匹配支配匹配

簡介 貪婪匹配 先看看整個字串是否存在匹配,如果未發現匹配,則去掉字串中的最後一個字元,再次嘗試匹配,如果還是未發現匹配再去掉最後一個字元,迴圈往復直到發現一個匹配或者字串不剩任何字串。 簡單量詞都是貪婪量詞。 惰性匹配 先看看字串的第一個字母

java表示式詳解(匹配切割和替換)

正則表示式:符合一定規則的表示式。作用:用於專門操作字串。特點:用於一些特定的符號來表示一些程式碼操作,這樣就簡化書寫。所以學習正則表示式,就是在學習一些特殊符號的使用。好處:可以簡化對字串的複雜操作。弊端:符號定義越多,正則越長,閱讀性越差。 具體操作功能: 1,匹配:

Java表示式過濾替換,將一段文字中的英語單詞分別提取出,並統計詞頻,按詞頻排序。

最近在學習自然語言處理,在建立基礎標籤庫時,遇到一個需要提取語料中的英文單詞的工作,做好了現在來和大家分享下。 實現效果:讀取檔案內容,把其中的英文單詞提取出,並統計詞頻。提取時,原本不是連在一起的單詞可以分開獨立提取,例如:我的PPT和WORD,可以提取出PPT,WORD兩個單詞。 基本思

Java表示式實現港臺身份證驗證

最近由於業務的要求,需要進行港、澳、臺人員身份證驗證,現在直接上程式碼,經供參考學習,也為自己積累一些工具類: package com.qiu.validate; public class regexValidateCard { public String validateIdCard10(String id

Java表示式匹配日期及基本使用

廢話不多說,直接上程式碼: package top.yangxianyang.test; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.junit.Test; public

java表示式匹配所有相匹配的內容

java使用正則表示式匹配所有內容 ---- ** 構建正則表示式 String patternCode="baseid=\\w+"; String patternTitle="title=\\\"[\\u4e00-\\u9fa5]*·?[\\u4e00-\\u9fa5]*\\(?[

Java 表示式 SQL匹配

DEMO public static void main(String[] args) {     String sql = "insert into table deep_creator.ys_tag_user select `id`,`value`,`l_date`,`

java 表示式java表示式匹配圖片個數

Java 正則表示式和 Perl 的是最為相似的。 java.util.regex 包主要包括以下三個類: 1、Pattern 類: pattern 物件是一個正則表示式的編譯表示。Pattern 類沒

Java表示式匹配規則

1.1 正則表示式的概念 正則表示式(英語:Regular Expression,在程式碼中常簡寫為regex)。 正則表示式是一個字串,使用單個字元串來描述、用來定義匹配規則,匹配一系列符合某個句法

java表示式 match find匹配位置

                如題,對於java正則表示式這幾個方法匹配一次後的,匹配位置搞不太清楚,就寫了幾個例子。如下:

java表示式匹配日期

public static List<String> run(String text) { String dateStr = text.replaceAll("r?n", " "); List<String>

java表示式 最大最小匹配

 String s = "/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n";          Pattern p = Pattern.compile("/m

Java 表示式 匹配括號中的數字

第一種:      String line = "+!!!0(100000000073);+!!!0(100000000071);";      String pattern = "(?<=\\()\\d+(?=\\))";      pattern = "(\\d{1

Java表示式系列】7 Capturing Groups(匹配組)

上一節中我們在學習Quantifier時候,也考察了和Capturing Groups結合的意義。本節主要對Capturing Groups進行描述一下。 它的意義和用途很簡單,它就是把一組字串當做一個整體來看待,比如 (abc)我們就應該將字串abc看做一個

匹配文字中的網址java表示式

司有個業務需要匹配文字中的網址,度娘,谷哥了半天經常看到有對html中獲取超連結的正則,只要匹配<a href=['"]?(.*?)['"]?即可,但如果是普通文字型別的則比較費事些,分享下最後的表示式: import java.util.regex.Matcher

表示式貪婪模式,單詞邊界 ,多行模式,子表示式java版)

@Test public void test3(){ //參考部落格:http://blog.csdn.net/gnail_oug/article/details/51260216 /

Java表示式過濾出字母數字和中文

1、Java中過濾出字母、數字和中文的正則表示式 (1)過濾出字母的正則表示式 [^(A-Za-z)] (2) 過濾出 數字 的正則表示式 [^(0-9)] (3) 過濾出 中文 的正則表示式 [^(\\u4e00-\\u9fa5)] (4) 過濾出字母、數字

JAVA 表示式的三種模式: 貪婪, 勉強和佔有的討論

    模式.*foo (貪婪模式):  模式分為子模式p1(.*)和子模式p2(foo)兩個部分. 其中p1中的量詞匹配方式使用預設方式(貪婪型)。  匹配開始時,吃入所有字元xfooxxxxxx去匹配子模式p1。匹配成功,但這樣以來就沒有了字串去匹配子模式p2。本輪匹配失敗;第二輪:減少p1部分的匹配量

java表示式匹配域名前半部分

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {

java表示式匹配

package offer; /* * 字串匹配 * "."匹配任意一個字元 * "*"表示前面的字元出現任意次 */ public class Match { public stati