2011-01-19 15 views
2

私は、Xの奇数を持つすべての文字列の数を数える半分の正規表現を持っています。文字列正規表現の文字を数えて

XAXAXA 

私はそのX年代を交互にしている文字列を可能にし、余分な句を必要とする:

^[^X]*X(X{2}|[^X])*$ 

これは、ほぼすべてのケースのために働く:のようなものを入力するとき

X 
XXX 
XAA 
AXXX 
AAAX etc 

たが失敗しましたXAXA。隣接するXパターンは既にX {2} *によってマッピングされています。

+2

に対してテスト ^[^X]*((X[^X]*){2})*X[^X]*$

私のために正常に動作し、これを試してみてください'AXXXAAXXX'。しかし要するに、私はこの仕事が可能であるとは思わない。 –

+0

他のAから1つのAをダイビングしている文字の量はまあまあです。確かに可能です - 私はそれを前に見たことがありますか? – dr85

答えて

5

X年代の凹凸の数からなる次の正規表現の一致文字列:

^[^X]*(X[^X]*X[^X]*)*X[^X]*$ 

一休みダウン:

^   # the start of the input 
[^X]*  # zero or more chars other than 'X' 
(   # start group 1 
    X[^X]* # an 'X' followed by zero or more chars other than 'X' 
    X[^X]* # an 'X' followed by zero or more chars other than 'X' 
)   # end group 1 
*   # repeat group 1 zero or more times 
X   # an 'X' 
[^X]*  # zero or more chars other than 'X' 
$   # the end of the input 

だから、繰り返しグループ1はゼロに一致するようになり、またはXの偶数が一致すると、Xの後に1つだけ不一致になります。

+0

+1:Nice!私はこれがうまくいくはずだと信じている。 –

+0

すごい偉大な - 他の方法もそれを行うことは可能ですか? A、(A [^ A] * A [^ A])* – dr85

+0

@ dr85のように、確かに 'X'または' A'で正規表現エンジンには関係ありません。 –

0

非正規表現の例

これは、パフォーマンス妨げるかもしれないが、私はあなたがそれを心配しているかどうかわからないです。

String str = "AXXXAXAXXX"; 
char[] cArray = str.toCharArray(); 
int count = 0; 

for (char c : cArray) 
{ 
    if (c == 'X') 
     count++; 
} 

if (count % 2 != 0) 
    //Odd 
+0

パフォーマンスwouldn邪魔されない。十分な大きさの文字列を取り、あなたの提案は正規表現を使うよりはるかに高速です。しかし、私の推測では、dr85は正規表現でこれをどうやって行うのか疑問に思っていたということです(私は彼/彼のコードで実際に使用しないことを望んでいます!):) –

+0

私はいつもこのメソッドを好むでしょう。 Imは分で正規表現を学習し、それは唯一の理由です。 – dr85

0

あなたはまた、例えば、 'X'の奇数の実行を扱ういくつかの方法が必要です

 
X - match 
XXX - match 
XAA - match 
AXXX - match 
AAAX - match 
XAXAXA - match 
XXAAAAAX - match 
AAXX - NO match 
AAXXXXXXAX - match 
+0

これは、@Bart Kiersの表現を少し凝縮したものに過ぎません。 –

+0

@エヴァン・ムラフスキー、これは一人で開発しましたが、しばらく時間がかかりました。@バート・キアーはもっと速くなりました – Valerij

+0

おそらく私はあなたの肩を見ていました! :) –