Javaによる正規表現

下記のReplaceクラスを用いると、正規表現にマッチした文字列に演算や加工を施した上で置き換えることができます。

備考)正規表現の中の丸括弧()で囲まれた部分に一致する文字列をサブマッチ文字列(submatch string)と呼びます。

regexp.java

import java.util.regex.*;

interface ReplaceRule {
  String rule(MatchResult matchResult);
}

class Replace {
  static String first(String string, String regexp, ReplaceRule replaceRule) {
    Pattern pattern = Pattern.compile(regexp);
    Matcher matcher = pattern.matcher(string);
    StringBuffer stringBuffer = new StringBuffer();
    if (matcher.find()) {
      matcher.appendReplacement(stringBuffer, replaceRule.rule(matcher.toMatchResult()));
    }
    matcher.appendTail(stringBuffer);
    return stringBuffer.toString();
  }
  static String all(String string, String regexp, ReplaceRule replaceRule) {
    Pattern pattern = Pattern.compile(regexp);
    Matcher matcher = pattern.matcher(string);
    StringBuffer stringBuffer = new StringBuffer();
    while (matcher.find()) {
      matcher.appendReplacement(stringBuffer, replaceRule.rule(matcher.toMatchResult()));
    }
    matcher.appendTail(stringBuffer);
    return stringBuffer.toString();
  }
}

class Main {
  public static void main(String... args) {
    String string = "(1+2),(3+4),(5+6)";
    String regexp = "\\(([0-9]+)\\+([0-9]+)\\)";
    Pattern pattern = Pattern.compile(regexp);
    Matcher matcher = pattern.matcher(string);

    System.out.println(Pattern.matches("abc", "abcde")); // -> false
    System.out.println(Pattern.compile("abc").matcher("abcde").matches()); // -> false
    System.out.println(Pattern.compile("abc").matcher("abcde").find()); // -> true

    System.out.println(string.replaceFirst(regexp, "$2*$1")); // -> 2*1,(3+4),(5+6)
    System.out.println(string.replaceAll(regexp, "$2*$1")); // -> 2*1,4*3,6*5

    ReplaceRule replaceRule = (MatchResult matchResult) -> String.valueOf(Integer.parseInt(matchResult.group(1)) + Integer.parseInt(matchResult.group(2)));
    System.out.println(Replace.first(string, regexp, replaceRule)); // -> 3,(3+4),(5+6)
    System.out.println(Replace.all(string, regexp, replaceRule)); // -> 3,7,11

    while (matcher.find()) {
      System.out.println(matcher.group(0) + "," + matcher.group(1) + "," + matcher.group(2));
    }
  }
}

以下のプログラムは無視して下さい!

text.java

import java.util.*;
import java.util.regex.*;

class Text {
  String string;
  Text(String string) {
    this.string = string;
  }
  String[] getContentsInBrackets(String left, String right) {
    Matcher matcher = Pattern.compile(left + "(.*?)" + right).matcher(string);
    List<String> stringArray = new ArrayList<>();
    while (matcher.find()) {
      stringArray.add(matcher.group(1));
    }
    return (String[])stringArray.toArray(new String[]{});
  }
  String getValue(String key, String delimiter) {
    Matcher matcher = Pattern.compile(key + delimiter + "([0-9A-Za-z]+)").matcher(string.replaceAll("[ \t]", ""));
    if (matcher.find()) {
      return matcher.group(1);
    }
    return null;
  }
}

class Main {
  public static void main(String... args) {
    System.out.println(Arrays.asList(new Text("{a1}, {a2}, {a3}").getContentsInBrackets("\\{", "\\}")));
    System.out.println(new Text(" key1 : value1, key2 : value2 ").getValue("key1", ":"));
    System.out.println(new Text(" key1 : value1, key2 : value2 ").getValue("key2", ":"));
  }
}


参考サイト

1.PatternとMatcherを使い、マッチングした内容を加味して置換
2.Java の正規表現で文字列を置き換える
3.Text Matching and Manipulation (Exact Match & Partial Match)

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中