2016-04-07 17 views
-3
^(((\d{0,5}){1}|(\d{0,5}\.{1}(\d{0,5}){1})){1}[x]{1}((\d{0,5}){1}|(\d{0,5}\.{1}(\d{0,5}){1})){1})$ 

文字列が (整数/小数のいずれか)x(整数/小数のいずれか)またはちょうど1つの整数/小数であるかどうかを正規表現がチェックするようにします。私が2xまたは2.5xを入力すると書いた正規表現は、偽であるべきですが、 'x'があっても2番目の整数/小数点が指定されていなくても一致していると言われます。またはxがなくても2.5であれば問題ありません。正規表現は機能しません、なぜですか?

私はそれを受け入れるようにしたいもののいくつかの例:

3x1 
12345.123451x12345.12345 
.12345x.12345 
00000.12345x1 
3 
4.12345 

私はそれを受け入れることを望んでいない:

1x 
1xx2 
4fx34 

私も数字があまりにも大きなものにしたくありません私はどこにでも{1}を持っています。私が望む最大値は、小数点以下5桁と5桁です。

2xと入力したときに正規表現でtrueを返していて、それが私のストアドプロシージャを破棄してデータを送信しています。許容される入力は2または2x1です。

+1

の終わりのためのアンカーです。あなたは問題が何であるかを明確にするような形式で質問を言い換えるべきです。 –

+1

すべての '{1}'はどうですか?それは削除できるノイズです。 –

+1

私は[regex101](https://regex101.com)で遊んでみることをお勧めします – excaza

答えて

0

さて、あなたの正規表現での不要なノイズの多い、などの多くがありました空の文字列に一致する{0,5}の使用によるエラーのためのスペース。だから私は少し書き換えを行なったし、5桁に制限のための本当の必要性がない場合は、+*{1,5}{0,5}を置き換えることができることを、最初に注意してください

^(?>\d{0,5}\.\d{1,5}|\d{1,5})(?:x(?>\d{0,5}\.\d{1,5}|\d{1,5}))?$ 

を思い付きました。また、最初の数字に6桁の数字があるため、質問の2番目の例と一致しません。

だから、少しそれを打破することができます:

  • ^は、文字列
  • (?>\d{0,5}\.\d{1,5}|\d{1,5})の開始のためのアンカーは、別の1に続くドット続い0〜5の数字のいずれかに一致する原子団であります5桁(10進数)または1〜5桁(整数)です。正規表現がマッチしないときに不必要なバックトラッキングを避けるために、ここでは原子グループを使用しました。
  • (?:x(?>\d{0,5}\.\d{1,5}|\d{1,5}))?は、以前と同じパターンに従って、文字xに続けて別の数字が続く任意のグループです。
  • $は、あなたが一致するwan't何パターンは不明である文字列
0

この正規表現は、6つの連続した数字を持っている#2が、すべてに一致します。

^(((\d{0,5})|(\d{0,5}\.(\d{0,5})))[x ]((\d{0,5})|(\d{0,5}\.(\d{0,5}))))\s*$

  1. {1}は無用です。私はそれをすべて削除しました。

  2. .

    あなたは文字通り期間

  3. 私はそれが最後の空白にもかかわらず、一致することを確認するために\s*(0以上の空白文字)を使用に一致させたい場合(\.)をエスケープする必要があります。最初に1つを追加することができます。


私はあなたがすべてのキャプチャグループでやっているかわからないんだけど。内側のものを気にしない場合は()の代わりに(?:)を使用することを検討してください。


編集:あなたが探しているもの、してみてくださいあなたの明確化に基づく:

^(((\d{1,5}|\d{0,5}\.(\d{0,5})))(?:[x ]((\d{1,5}|\d{0,5}\.(\d{0,5})))))?\s*$

+0

ありがとうございます。私が受け入れるフォーマットが「2x」と入力しても大丈夫ではないと思います。1 int/decimal multiplied別のint/decimalまたは1つの整数/小数点だけであるので、 '2x'は偽でなければなりませんが、正規表現はそれが真であると言います。私はRegex101.comを使用しています – CarleyDiaz

関連する問題