簡體   English   中英

Java 7中名為捕獲組的正則表達式支持

[英]Regular Expression named capturing groups support in Java 7

由於Java 7正則表達式API提供了對命名捕獲組的支持。 方法java.util.regex.Matcher.group(String)返回由給定的命名捕獲組捕獲的輸入子序列,但是API文檔上沒有可用的示例。

在Java 7中指定和檢索命名捕獲組的正確語法是什么?

指定命名的捕獲組

使用以下帶有單個捕獲組的正則表達式作為示例([Pp]attern)

以下是有關如何為上述正則表達式指定命名捕獲組的 4個示例:

(?<Name>[Pp]attern)
(?<group1>[Pp]attern)
(?<name>[Pp]attern)
(?<NAME>[Pp]attern)

請注意, 捕獲組名稱必須嚴格匹配以下模式:

[A-Za-z][A-Za-z0-9]*

組名區分大小寫,因此在引用它們時必須指定確切的組名(請參閱下文)。

在正則表達式中反向引用命名的捕獲組

要在正則表達式中反向引用與命名捕獲組匹配的內容 (對應於上面的4個示例):

\k<Name>
\k<group1>
\k<name>
\k<NAME>

命名的捕獲組仍在編號,因此在所有4個示例中,可以按常規使用\\1對其進行反向引用。

請參考替換字符串中的命名捕獲組

在替換字符串中引用捕獲組 (對應於上面的4個示例):

${Name}
${group1}
${name}
${NAME}

與上述相同,在所有四個示例中,可以在替換字符串中以$1引用捕獲組的內容。

COMMENT模式命名的捕獲組

本節以(?<name>[Pp]attern)為例。

Oracle對COMMENT模式的實現(嵌入式標志(?x) )將以下示例解析為與上述正則表達式相同:

(?x)  (  ?<name>             [Pp] attern  )
(?x)  (  ?<  name  >         [Pp] attern  )
(?x)  (  ?<  n  a m    e  >  [Pp] attern  )

除了不能分隔的?<之外,它甚至允許在捕獲組的名稱之間允許任意間隔。

不同的捕獲組名稱相同嗎?

盡管在.NET,Perl和PCRE中可以為不同的捕獲組定義相同的名稱,但Java(Java 8)當前不支持該名稱。 不同的捕獲組不能使用相同的名稱。

命名與捕獲組相關的API

Matcher類中的新方法支持按組名檢索捕獲的文本:

從Java 8開始, MatchResult類中缺少相應的方法。針對此問題,正在進行的增強請求JDK-8065554

當前沒有任何API可用於獲取正則表達式中命名捕獲組的列表。 我們必須跳過額外的障礙才能做到 盡管對於編寫大多數正則表達式沒有用,除了編寫正則表達式測試器之外。

對於以“ name”命名的匹配組X,命名捕獲組的新語法為(?<name>X) 以下代碼捕獲正則表達式(\\ w +)(任何字母數字字符組)。 要命名此捕獲組,必須添加表達式? 在正則表達式之前的括號內。

Pattern compile = Pattern.compile("(?<teste>\\w+)");
Matcher matcher = compile.matcher("The first word is a match");
matcher.find();
String myNamedGroup= matcher.group("teste");
System.out.printf("This is yout named group: %s", myNamedGroup);

此代碼返回輸出以下輸出:

這是您的命名群組:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM