讀取用戶輸入的正則表達式模式,然後循環讀取待匹配字符串,輸出是否匹配及捕獲組詳細信息(組開始/結束位置、括號可視化)。
package regex;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Enter pattern:");
String patternString = in.nextLine();
Pattern pattern = Pattern.compile(patternString);
while (true) {
System.out.println("Enter String to match: ");
String input = in.nextLine();
if (input == null || input.isEmpty()) return;
Matcher matcher = pattern.matcher(input);
if (matcher.matches()) {
System.out.println("Match");
int g = matcher.groupCount();
if (g > 0) {
// 可視化捕獲組位置
for (int i = 0; i < input.length(); i++) {
// 處理空組 ()
for (int j = 1; j <= g; j++) {
if (i == matcher.start(j) && i == matcher.end(j)) {
System.out.print("()");
}
}
// 處理組開始 (
for (int j = 1; j <= g; j++) {
if (i == matcher.start(j) && i != matcher.end(j)) {
System.out.print('(');
}
}
System.out.print(input.charAt(i));
// 處理組結束 )
for (int j = 1; j <= g; j++) {
if (i + 1 == matcher.end(j) && i + 1 != matcher.start(j)) {
System.out.print(')');
}
}
}
System.out.println();
}
} else {
System.out.println("No match");
}
}
}
}
Enter pattern: (a*)(b*) Enter String to match: aaabbb Match (((aaa)))bbb Enter String to match: aab Match ((aa))b Enter String to match: (程序退出)