5

明確にするために、正規表現を使用して一致させる方法を知りたいです。

ab
aabb
aaabbb 
...

私はこれがで動作することを知りましたPerl:

if ($exp =~ /^(a(?1)?b)$/)

これを理解するには、文字列が左右ではなく外側から伸びているかのように見てください。

ab
a(ab)b
aa(ab)bb

(?1)括弧の外側のセットへの参照です。最後のケース (外側から内側へ) には after が必要です?。何も残らず?、前の式の 0 または 1 を意味します (したがって、基本的に基本ケースとして機能します)。

私の質問は次のとおりです(?1)。Javaでの同等物は何ですか?

4

4 に答える 4

5

一般に、正規表現は正規言語に限定されています。つまり、正規表現は DFA (離散有限オートマトン) で受け入れられる言語と同等であるため、数えることができません。可能なカウント値。

離散 != 無限なので、実際には数えることはできませんが、 (a (something) b) の例のように、いくつかの限定されたタイプのマッチングを行うことができます。

DFA (および拡張による正規言語/正規表現) のいくつかの制限について説明し ます http://www.cs.washington.edu/education/courses/cse599/99sp/admin/Slides/Week2/sld012.htm

DFA の詳細 (まだ少し高レベル) を説明することで制限を拡張した、より適切で詳細なスライド http://www.cs.princeton.edu/courses/archive/spr05/cos126/lectures/18.pdf

ところで、インサイドアウト展開は、文字列のミラー イメージを再構築するパターン マッチングを使用して、実際にカウントする必要性を基本的に回避する DFA の優れたトリックです。カウントするように見えますが、(ミラーリングされた順序マッチングとは対照的に) 順序でマッチングを要求するなど、もっと興味深いことを行うとすぐにバラバラになります。

于 2013-06-11T20:46:12.127 に答える
1

Patternおよびクラスを使用してMatcher、2 つの文字のうちの 1 つの出現回数をカウントし、{n}構文を使用して正規表現でこの数を適用できます。

import java.util.regex.*;

class Test {
    public static void main(String[] args) {
        String  s       = "aaaabbbb";
        Pattern pattern = Pattern.compile("a");
        Matcher matcher = pattern.matcher(s);

        // count all 'a's
        int count = 0;
        while (matcher.find())
            count++;

        // now enforce count matches for a and b in your regular expression
        String rExp = String.format("a{%d}b{%d}", count, count);
        Pattern matchSameCount = Pattern.compile(rExp);

        Matcher m2 = matchSameCount.matcher(s);
        System.out.println( m2.matches()); 
        // prints true
    }
}

全体的にはもう少し手間がかかりますが、現時点で実際に機能すると私が考えることができる唯一の方法です。

于 2013-06-11T20:57:23.580 に答える
0

その言語は規則的ではありません (以下の説明を参照)。したがって、そのような言語を正規表現と一致させることはできません。

繰り返される単語を保持するためのスタックが必要になります。

次のリンクを読むことをお勧めします。

NFA: http://en.wikipedia.org/wiki/Nondeterministic_finite_automaton この言語が規則的でない理由の説明:なぜ {a^nb^n | n >= 0} 規則的ではない?

于 2013-06-11T20:58:35.670 に答える
-5

Java 開発者ではありませんが、Perl の経験は豊富です

私はあなたの Q を誤解したかどうか疑問に思っています!

;-)

于 2013-06-11T20:45:07.763 に答える