Java 正則表達(dá)式組

2018-02-12 23:18 更新

Java正則表達(dá)式教程 - Java正則表達(dá)式組


我們可以通過(guò)括號(hào)將多個(gè)字符組合為一個(gè)單位。例如,(ab)

正則表達(dá)式中的每個(gè)組都有一個(gè)組號(hào),從1開始。

Matcher類中的方法groupCount()返回與Matcher實(shí)例相關(guān)聯(lián)的模式中的組數(shù)。

組0引用整個(gè)正則表達(dá)式和不由groupCount()方法報(bào)告。

正則表達(dá)式中的每個(gè)左括號(hào)標(biāo)記新組的開始。

我們可以在正則表達(dá)式中返回引用組號(hào)。

假設(shè)我們要匹配以“abc"開頭,后跟“xyz"的文本,后跟“abc"。

我們可以寫一個(gè)正則表達(dá)式為“abcxyzabc"。

我們可以使用反向引用將正則表達(dá)式重寫為“(abc)xyz \\ 1"。 \1 指第1組,即(abc)

\2 引用組2, \3 引用組3,依此類推。

以下代碼顯示如何顯示格式化的電話號(hào)碼。在正則表達(dá)式 \b(\d{3})(\d{3})(\d{4})\b \b 表示我們感興趣的是僅在字邊界匹配十個(gè)數(shù)字。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
  public static void main(String[] args) {
    String regex = "\(\\d{3})(\\d{3})(\\d{4})\";

    Pattern p = Pattern.compile(regex);
    String source = "1234567890, 12345,  and  9876543210";

    Matcher m = p.matcher(source);

    while (m.find()) {
      System.out.println("Phone: " + m.group() + ", Formatted Phone:  ("
          + m.group(1) + ") " + m.group(2) + "-" + m.group(3));
    }
  }
}

上面的代碼生成以下結(jié)果。


例子

以下代碼顯示如何引用替換文本中的組。

$n ,其中 n 是組編號(hào),替換文本內(nèi)部是指組 n 的匹配文本。

例如, $1 是指第一個(gè)匹配的組。要重新格式化電話號(hào)碼,我們將使用($1) $2- $3 。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
  public static void main(String[] args) {
    String regex = "\(\\d{3})(\\d{3})(\\d{4})\";
    String replacementText = "($1) $2-$3";
    String source = "1234567890, 12345, and 9876543210";

    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(source);

    String formattedSource = m.replaceAll(replacementText);

    System.out.println("Text: " + source);
    System.out.println("Formatted Text: " + formattedSource);
  }
}

上面的代碼生成以下結(jié)果。


命名組

我們可以在正則表達(dá)式中使用命名組。

我們可以命名一個(gè)組,然后使用他們的名字來(lái)引用參考組。

我們可以在替換文本中引用組名稱,并使用組名稱獲取匹配的文本。

定義命名組的格式為

(?<groupName>pattern)

一對(duì)括號(hào)標(biāo)記一個(gè)組。開始括號(hào)后面跟著一個(gè)?和放在尖括號(hào)中的組名稱。

組名稱只能包含字母和數(shù)字,且只能以字母開頭。

以下正則表達(dá)式具有三個(gè)命名組。

  • areaCode
  • prefix
  • postPhoneNumber

正則表達(dá)式匹配10位數(shù)的電話號(hào)碼。

(?<areaCode>\d{3})(?<prefix>\d{3})(?<postPhoneNumber>\d{4})

以下代碼顯示如何使用命名組。

String  replacementText = "(${areaCode}) ${prefix}-${postPhoneNumber}";

我們可以混合組號(hào)和組名。

上述正則表達(dá)式可以重寫如下。

String  replacementText = "(${areaCode}) ${prefix}-$3";

以下代碼顯示如何在正則表達(dá)式中使用組名稱以及如何在替換文本中使用名稱。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
  public static void main(String[] args) {
    String regex = "\(?<areaCode>\\d{3})(?<prefix>\\d{3})(?<postPhoneNumber>\\d{4})\";

    String replacementText = "(${areaCode}) ${prefix}-$3";
    String source = "1234567890 and 9876543210";
    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher(source);

    String formattedSource = m.replaceAll(replacementText);

    System.out.println("Text: " + source);
    System.out.println("Formatted Text: " + formattedSource);
  }
}

上面的代碼生成以下結(jié)果。

組邊界

我們可以使用 start() end()方法來(lái)獲取組的匹配邊界。 這些方法重載:

int start()
int start(int groupNumber)
int start(String groupName)
int end()
int end(int groupNumber)
int  end(String groupName)

方法返回上一次匹配的開始和結(jié)束。

以下代碼顯示如何匹配10位電話號(hào)碼,并為每個(gè)成功匹配打印每個(gè)組的開始。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
  public static void main(String[] args) {
    String regex = "\(?<areaCode>\\d{3})(?<prefix>\\d{3})(?<postPhoneNumber>\\d{4})\";
    String source = "1234567890, 12345, and 9876543210";
    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher(source);
    while (m.find()) {
      String matchedText = m.group();
      int start1 = m.start("areaCode");
      int start2 = m.start("prefix");
      int start3 = m.start("postPhoneNumber");
      System.out.println("Matched Text:" + matchedText);
      System.out.println("Area code start:" + start1);
      System.out.println("Prefix start:" + start2);
      System.out.println("Line Number start:" + start3);
    }
  }
}

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)