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