1

-359 から +359 (オプションの符号付き) までの角度で方向を検証する正規表現を作成しました。これは私の正規表現です:

const QString xWindDirectionPattern("[+-]{0,1}([0-9]{1,2}|[12][0-9]{2}|3[0-5][0-9])");

ここで、-359.99 から +359.99 までの数値を書き込むために、2 つの 10 進数を追加します。\.[0-9]{1,2}|[0-9]{1,3} を追加するようなことを試しましたが、うまくいきません。

オプションの小数点が欲しいので、

23.3   valid
23.33  valid
23     valid
23.333 not valid

this oneのような他の質問をいくつか読みましたが、私の場合のように、数値範囲に一致するように例を変更することはできません。どうすればこの結果を達成できますか?

返信ありがとうございます。

どうすればこれを達成できますか?

4

3 に答える 3

2

-359 から +359 までの角度で方向を検証する正規表現を作成しました。

いいえ、できません。すべきではありませ。間違ったツールを使用しています。正規表現は、文字のセマンティクスを掘り下げる必要がある種類の検証を行うことができません。

正規表現はテキストを処理して照合することしかできませんが、実際の意味を識別することはできません。基本的に、正規表現は通常の言語の解析には適していますが、それ以外のほとんどすべてには適していません。

例:

  • 正規表現は 3 桁に一致できますが、範囲 - に該当する 3 桁に一致させるためにそれを使用することは非常に非現実的[259, 634]です。そのためには、その数字の個々の数字の意味を知る必要があります。
  • 正規表現は - のような日付のパターンに一致できますが、どの部分がで、どの部分が で\d\d/\d\d/\d\dあるかを識別できません。datemonth
  • x同様に、2 つの数字とを見つけることはできますがy、かどうかを識別することはできませx < yん。

上記のタスクでは、テキストの意味を理解する必要があります。正規表現ではそれができません

もちろん、確かに正規表現を思いつきましたが、ご覧のとおり、非常に柔軟性がありません。要件を少し変更すると、正規表現とあなたの両方が台無しになります。

対応する言語機能を使用することをお勧めします-構造体if-elseは、正規表現ではなく、その範囲の学位を読んでいることを確認するのが好きです。

于 2013-07-30T14:22:10.573 に答える
1

試してみてください[+-]?([1-9]\d?|[12]\d{2}|3[0-5]\d)(\.\d{1,2})?

[+-]?          Optional Sign
[1-9]\d?       1 or 2 digit number
[12]\d{2}      100 to 299
3[0-5]\d       300 to 359
(\.\d{1,2})?   Optional decimal point followed by 1 or two digits
于 2013-07-30T14:23:26.037 に答える
1

あなたはこれを行うことができます:

[+-]{0,1}((?:[0-9]{1,2}|[12][0-9]{2}|3[0-5][0-9])(?:\.[0-9]{1,2})?)

これにより、小数点の後に 1 桁または 2 桁を続けることができます。おそらく、開始アンカーと終了アンカー ( ^/ $) を使用して、文字列にこのパターン以外の文字が含まれないようにすることもできます。これがないと、上記のパターンに一致する23.333ため許可されます。23.33

^[+-]{0,1}((?:[0-9]{1,2}|[12][0-9]{2}|3[0-5][0-9])(?:\.[0-9]{1,2})?)$

ここでテストできます。

于 2013-07-30T14:17:56.027 に答える