3

パターン「abc|de.|ghi」と「def」の入力があります。「def」に一致するパターンの部分を見つけるにはどうすればよいですか? したがって、この例では、必要な結果は "de." です。「def」ではありません。グループおよび開始/終了メソッドを使用して取得できたのはこれだけです。

コード内:

Pattern p = Pattern.compile("abc|de.|ghi");
Matcher m = p.matcher("def");
if(matcher.find()) {
    // Here I want to get the String "de." somehow
}
4

3 に答える 3

1

Pattern標準ライブラリでこれを行う簡単な方法はありません。

ソース コードPatternNodeは、再帰降下パーサーを使用して、それぞれがメソッドをサポートするオブジェクトのツリーを作成しますmatch()。たとえば、 を評価するために、可能な選択肢のリストを格納|するBranchサブクラスが 4107 行にあります。そのmatch()メソッドは各選択肢を試行し、選択肢trueのいずれかが一致し、後続ノードが一致する場合に戻ります。それ以外の場合は を返しますfalse

グループは、各グループの開始位置と終了位置をクラスのプライベート変数に保存する特別なノードGroupHeadとノードを解析ツリーに挿入することによって保存されます。GroupTailPattern

パターンのどの部分が一致したかを調べるには、ノード オブジェクトは、それらが作成される原因となったパターンの部分を知る必要があります。パーサーは、作成したノードにその情報を保存しません。元のパターンはtemp配列に格納され、再帰降下パーサーは解析時cursorに配列にインデックスを保持tempします。peek()やのようなパーサー ヘルパー メソッドはaccept()、1567 行目から定義されており、必要に応じて単純にインクリメントcursorされます。ノードが作成されるとき、 の値はcursorどこにも保存されません。しかし、その値は、パターンのどの部分が一致に対応するかを再構築するために必要です。

がこの情報を保存しない理由は理解できPatternます。すべての正規表現の評価が遅くなりますが、追加機能はほとんど使用されません。

Pattern1 つの可能性は、一致を元のパターンの部分まで追跡するために適切な簿記を行うの修正版を作成することです。各ノードが対応するパターンの部分を保存するために、Node()コンストラクターにcursorフィールドのコピーを隠しておくことで解決できる場合があります。しかし、そのデータを使用してパターンのどの部分が一致したかを見つけるには、すべてNodeのサブクラスのmatch()メソッドを更新して、…の各サブクラスのセマンティクスに基づいて範囲を格納する必要がありNodeます。

幸運を!

于 2013-07-05T07:10:20.403 に答える
1

したがって、入力に一致した正規表現を返したい..パターンまたはマッチャークラスに、またはで区切られた正確なパターンを返すようなメソッドはないと思います

だから、あなたはこのようにすることができます

public static String getMatchedRegexPattern(String inputRegex,String input) throws Exception
{
    if(Pattern.compile("(?<!\\\\)([\\(\\)\\[\\]])").matcher(inputRegex).find())throw new Exception("Groups,brackets not supported");
    for(String regex:inputRegex.split("(?<!\\\\)\\|"))//split only if | is not escaped
    {
    if(Pattern.compile(regex).matcher(input).matches())
        return regex;
    }
    return "";
}

あなたはそれを次のように呼ぶことができます

getMatchedRegexPattern("abc|de.|ghi","def");
于 2013-07-05T03:23:02.930 に答える