2011-10-27 9 views
0

CSS3の:nth-child()で使用されているのと同じように、現在のプロジェクトで数値式を解析して検証する必要があります。基本的には、式はan+bで、abは整数値(正と負の両方)でなければなりません。また、0と等しくすることもできます。CSS数値式パーサとバリデータ

もっと明瞭にするためのいくつかの例:2n+12n4およびn+2は有効です。基本的にabは、符号付きまたは符号なしの整数のいずれかです。

以下の例:

  • n (a=1, b=0)
  • n+1 (a=1, b=1)
  • 1 (a=0, b=1)
  • 2n+1 (a=2, b=1)
  • 23n+45 (a=23, b=45)
  • 2n-2 (a=2, b=-2)
  • -1 (a=0, b=-1)
  • -2n (a=-2, b=0)

すべて有効です。これは、aまたはbが整数でない場合、または式に他の文字がある場合にのみ失敗します。

これらの式を解析して検証するにはどうすればよいですか。私は適切なソリューションがREGEXesであると信じていますが、私はこれをどう構築することができないのでしょうか。

+0

提出された式がREGEXと一致する場合はtrueを返し、検証をパスします。私はREGEX自体にもっと興味があります。私はこれをPHPで使用しています。 – linkyndy

+0

近いかもしれないが、検証に合格していないものの例を提供してください –

+0

@linkyndy、ああ、申し訳ありませんが、私はあなたが "validate"と言ったところで "evaluate"を読んでいます。決して私のコメントに気をつけない。 –

答えて

3

EDIT:

5n+12 3456 -5  2  123n+6 8n 13n-6 n+2 

そして、これらは無効です:

25n.1 4x+4 2n+ 6N-2 8n-+5 n+-3 Rn+T  x+1 
は、質問 のEND EDIT

に指定されているこれらが有効な値である場合は負の数を許可するように改訂されました

この式で検証する必要があります。

^(-?\d+(n([+-]\d+)?)?)$ 

この式は言う:

^   # Assert beginning of line 
(\d+  # Match one or more digits 
    (n  # TRY to Match a literal n character 
    (\+\d+ #  TRY to match a literal plus character followed by one or more digits 
    )?  #  END TRY 
)?  # END TRY 
)   # End Match 
$   # Assert at end of string 

TRY sが検証しようとしますが、それがない場合は気にしないだろう。

EDIT:

上記の式は検証する必要がありますが、この表現はabための番号のみをキャプチャするという名前のキャプチャグループab、と肯定先読みを使用して、正確にあなたが求める結果を出す必要がありますそして、+シンボルを除外するが、唯一の負の数のため-シンボルキャプチャする:

^(?:(?:(?P<a>-?\d*)n)?(?=[+-]?\d+|$)\+?(?P<b>-?\d+)?)$ 

結果はようでなければなりませんが次の:

:あなたは n+22のために結果を区別する何らかの問題が発生した場合

source  a  b 
------  ------ ------ 
5n+12  5  12 
3456    3456 
2     2 
123n+6  123  6 
8n   8   
-5     -5 
13n-6  13  -6 
n+2    2 
n 

私は<null value or nothing>,zero length or null string>対二分法は、PHPとpreg_match_allにどのように動作するか完全にわからないので、私はこの表現を使用することをお勧めしますない場合は

^(?:(?P<n>(?P<a>-?\d*)n)?(?=[+-]?\d+|$)\+?(?P<b>-?\d+)?)$ 

これはn+22、および12n+2のために、これが発生し、全体の「n」は式または何をキャプチャ:

source n  a  b 
------  ------ ------ ------ 
2       2 
n+2  n    2 
12n+2  12n  12  2 
+0

'n + 2'が有効である必要があります。基本的に、 'a'と' b'は任意の種類の整数、符号付きまたは符号なしです。 (a = 1、b = 1)、1(a = 0、b = 1)、2n + 1(a = 2、 b = -2)、-1(a = 0、b = -1)、23n + 45(a = 23、b = 45) '、' -2n(a = -2、b = 0) 'はすべて有効です。これは 'a'や' b'が整数でない場合や、式に他の文字がある場合にのみ失敗します。 – linkyndy

+0

あなたの非常に詳細な回答をありがとう! – linkyndy

1

あなたは^(?:(?:(-?\d*)n)?([+-]\d+)?|(\d+))$のようになります。
これは、2つの成功したキャプチャグループの2つの数値を返します。

+0

これは、 'a'と' b'の数字が正しく書式化されているかどうかを返します(整数)?また、文字列には 'an + b'式以外の何も入れてはいけません。コードスニペットでこれを考慮しましたか?申し訳ありませんが、REGEXでの私のスキルは非常に低いです::) – linkyndy

+0

文字列が正しい場合にのみ一致します。一致する場合は、キャプチャグループとして数値を返します。あなたは正規表現を学ぶべきです。 – SLaks

+0

ありがとうございます。私は知っている、私はそれらを学ぶ必要があります。 – linkyndy