1. 程式人生 > >關於java正則表示式非捕獲型括號和捕獲型括號的研究

關於java正則表示式非捕獲型括號和捕獲型括號的研究

        今天在做一個正則表示式的解析時,突然看見一個?:的例子,就看不懂了,然後在網上查了下,竟然是非捕獲型括號,意思就是匹配pattern,但不包含在match的group方法裡面。

        (?:  pattern)是非捕獲型括號  匹配pattern,但不捕獲匹配結果。
        (pattern )是捕獲型括號。  匹配pattern,匹配pattern並捕獲結果,自動獲取組號

深入瞭解還得看例子:

例一:

	@Test
	public void test9(){
		
		
		Pattern p = Pattern.compile("(\\d+,)(\\w+)");

		String s = "123,abc-78,def";
		Matcher m = p.matcher(s);
		while(m.find())
		{
		  System.out.println("m.group():"+m.group()); //列印所有
		  System.out.println("m.group(1):"+m.group(0)); //列印所有
		  System.out.println("m.group(1):"+m.group(1)); //列印數字的
		  System.out.println("m.group(2):"+m.group(2)); //列印字母的
		}		
	}


輸出:

m.group():123,abc
m.group(1):123,abc
m.group(1):123,
m.group(2):abc
m.group():78,def
m.group(1):78,def
m.group(1):78,
m.group(2):def

例二:

@Test
	public void test10(){
		
		
		Pattern p = Pattern.compile("(\\d+)-(\\d+)-(\\d+)\\s+([A-z]+)\\s+([A-z]+)\\s+(\\d+):(\\d+)");
		
		String s = "2013-10-26 wei test 15:39";
		Matcher m = p.matcher(s);
		
		if(m.find())
		{
			System.out.println(m.groupCount());
			System.out.println("m.group():"+m.group()); //2013-10-26 wei test 15:39
			System.out.println("m.group():"+m.group(0)); //2013-10-26 wei test 15:39
			System.out.println("m.group(1):"+m.group(1)); //2013
			System.out.println("m.group(2):"+m.group(2)); //10
			System.out.println("m.group(3):"+m.group(3)); //26
			System.out.println("m.group(4):"+m.group(4)); //wei
			System.out.println("m.group(5):"+m.group(5)); //test
			System.out.println("m.group(6):"+m.group(6)); //15
			System.out.println("m.group(7):"+m.group(7)); //39
		}		
	}

例三:

@Test
	public void test11(){
		
		
		Pattern p = Pattern.compile("((\\d+)-(\\d+)-(\\d+))\\s+([A-z]+)\\s+([A-z]+)\\s+((\\d+):(\\d+))");
		
		String s = "2013-10-26 wei test 15:39";
		Matcher m = p.matcher(s);
		if(m.find())
		{
			System.out.println("m.group():"+m.group()); //2013-10-26 wei test 15:39
			System.out.println("m.group():"+m.group(0)); //2013-10-26 wei test 15:39
			System.out.println("m.group(1):"+m.group(1)); //2013-10-26
			System.out.println("m.group(2):"+m.group(2)); //2013
			System.out.println("m.group(3):"+m.group(3)); //10
			System.out.println("m.group(4):"+m.group(4)); //26
			System.out.println("m.group(5):"+m.group(5)); //wei
			System.out.println("m.group(6):"+m.group(6)); //test
			System.out.println("m.group(7):"+m.group(7)); //15:39
			System.out.println("m.group(8):"+m.group(8)); //15
			System.out.println("m.group(9):"+m.group(9)); //39
		}		
	}


例四:

@Test
	public void test12(){
		
		
		Pattern p = Pattern.compile("((?:\\d+)-(\\d+)-(\\d+))\\s+([A-z]+)\\s+([A-z]+)\\s+((\\d+):(\\d+))");
		
		String s = "2013-10-26 wei test 15:39";
		Matcher m = p.matcher(s);
		if(m.find())
		{
			System.out.println(m.groupCount());//8
			System.out.println("m.group():"+m.group()); //2013-10-26 wei test 15:39
			System.out.println("m.group():"+m.group(0)); //2013-10-26 wei test 15:39
			System.out.println("m.group(1):"+m.group(1)); //2013-10-26
			System.out.println("m.group(2):"+m.group(2)); //10
			System.out.println("m.group(3):"+m.group(3)); //26
			System.out.println("m.group(4):"+m.group(4)); //wei
			System.out.println("m.group(5):"+m.group(5)); //test
			System.out.println("m.group(6):"+m.group(6)); //15:39
			System.out.println("m.group(7):"+m.group(7)); //15
			System.out.println("m.group(8):"+m.group(8)); //39
			
		}		
	}


例五:

@Test
	public void test13(){
		
		
		Pattern p = Pattern.compile("(?:(?:\\d+)-(\\d+)-(\\d+))\\s+([A-z]+)\\s+([A-z]+)\\s+((\\d+):(\\d+))");
		
		String s = "2013-10-26 wei test 15:39";
		Matcher m = p.matcher(s);
		if(m.find())
		{
			System.out.println(m.groupCount());//7
			System.out.println("m.group():"+m.group()); //2013-10-26 wei test 15:39
			System.out.println("m.group():"+m.group(0)); //2013-10-26 wei test 15:39
			System.out.println("m.group(1):"+m.group(1)); //10
			System.out.println("m.group(2):"+m.group(2)); //26
			System.out.println("m.group(3):"+m.group(3)); //wei
			System.out.println("m.group(4):"+m.group(4)); //test
			System.out.println("m.group(5):"+m.group(5)); //15:39
			System.out.println("m.group(6):"+m.group(6)); //15
			System.out.println("m.group(7):"+m.group(7)); //39
		}		
	}

相關推薦

關於java表示式捕獲括號捕獲括號研究

        今天在做一個正則表示式的解析時,突然看見一個?:的例子,就看不懂了,然後在網上查了下,竟然是非捕獲型括號,意思就是匹配pattern,但不包含在match的group方法裡面。         (?:  pattern)是非捕獲型括號  匹配pattern,

java 表示式 捕獲組(特殊構造

在 java api 文件中的正則表示式關於特殊構造(非捕獲組)的說明看不懂。例如:(?:X) X,作為非捕獲組 (?idmsux-idmsux) Nothing,但是將匹配標誌由 on 轉為 off (?idmsux-idmsux:X) X,作為帶有給定標誌 on - off 的非捕獲組 (?=X

java表示式 捕獲組詳解

這幾天看了下正則表示式,對非捕獲組(non-capturing)進行下總結。 主要總結 1個 + 2組  一共5個。 (?:X) (?=X) (?<=X) (?!X) (?<!X) 一、先從(?:)非捕獲組說起。 下面由一個例子引出非捕獲組。 有兩個金額:889

表示式——捕獲分組

  目前為止,總共介紹了括號的三種用途: 分組,將相關的語速歸攏到一起,構成單個元素;多選結構,規定可能出現的多個子表達示;引用分組,將子表示式匹配的文字儲存起來,供之後引用。   這三種用途並不是彼此獨立的,而是互相重疊的: 單純的分組可以視為“只包含一個多選分支的多選結構”;整個多選結構也會被視為單個元

java表示式去掉所有中括號【】

2018年11月17日 13:02:33 進擊的流氓 閱讀數:1 標籤: 正則表示式

JAVA表示式高階用法(分組與捕獲)

 正則表示式在字串處理中經常使用,關於正則簡單的用法相信有一點程式基礎的人都懂得一些,這裡就不介紹簡單基礎了。這裡主要講解一下在JAVA中實現了的正則的高階用法-分組與捕獲。     對於要重複單個字元,非常簡單,直接在字元後賣弄加上限定符即可,例如 a+ 表示匹配1個或

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

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

java表示式捕獲分組與Back引用

一.捕獲分組 java正則表示式中以()括起來的內容表示一個分組,像((A)(B(C)))這個表示式中,共存在四個分組: 1.ABC 2.A 3.BC 4.C 很容易發現,分組是按照左邊的括號出現的順序來標號的 這就是捕獲分組 二.Back引用 我們以下面這個正則表示式為例

java表示式捕獲

Java中使用正則表示式返回符合正則表示式的字串就要用到group(),group中記錄了所有符合指定表示式的字串。本文通過一段程式碼講解如何使用group()。<span style="whi

java表示式學習筆記

本人在開發中使用正則表達的場景並不多,偶爾用一下,學習一波,時間久了就又忘記了,放到部落格中,說不定什麼時候就用到了。   一.正則表示式的語法 這個語法表來自:http://www.runoob.com/java/java-regular-expressions.html

JAVA表示式區分IPv4IPv6地址

PS*程式碼直接見第二部分: 一、進入正題前先說說JAVA正則表示式相關概念: 1、常用字元類: [abc] == a||b||c   [a-zA-Z] == 所有大小寫字母中的任意一個      [0-9A-Za-z] == 任意

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

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

java表示式去除html中所有的標籤特殊HTML字元

關於java正則表示式去除html中所有的標籤和特殊HTML字元,結合我所做的專案總結的經驗: 總共分為三種:第一種適用於適用短的文章,將文章用正則表示式的方式拼接到程式碼中,有些繁瑣,其實不太實用。第二種就是直接將文件引入,進行更改,但是有一個小缺點,就是文件中的格式可能是utf-8格式的

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

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

JAVA表示式初探

今天有一個需求 ,提上來類似 123#223#2 這樣的字串,要把裡面的數字匹配出來,就看了一下java的正則 以前一直用python處理正則,相比之下java的正則功能是弱了一點 public static void main(String[] args) { Pat

20180716-Java表示式

import java.util.regex.Matcher;import java.util.regex.Pattern; public class RegexMatches{ public static void main(String[] args){ //按指定模式在字串查詢 String line

java表示式的使用:6位數字

public static void main(String[] args) { Pattern pattern = Pattern.compile("\\d{6}"); boolean matches = pattern.matcher("a21109").matches(); S

Java——表示式

正則表示式定義了字串的模式。 正則表示式可以用來搜尋、編輯或處理文字。 正則表示式並不僅限於某一種語言,但是在每種語言中有細微的差別。 java.util.regex 包主要包括以下三個類: Pattern 類: pattern 物件是一個正則表示式的編譯表示。Pattern

java表示式校驗

Pattern pattern = Pattern.compile("\\d+\\.\\d+$|-\\d+\\.\\d+$");//判斷是否為小數 Pattern pattern1 = Pattern.compile("^\\d+$|-\\d+$"); if (pattern.match

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

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