数値のみの正規表現


309

正規表現をまったく使用していないため、トラブルシューティングが困難です。含まれている文字列がすべて数字の場合にのみ正規表現を一致させたい。ただし、以下の2つの例では、すべての数値と「1234 = 4321」のような等号を含む文字列と一致しています。この振る舞いを変更する方法は確かにあると思いますが、私が言ったように、私は正規表現をあまり使ったことはありません。

string compare = "1234=4321";
Regex regex = new Regex(@"[\d]");

if (regex.IsMatch(compare))
{ 
    //true
}

regex = new Regex("[0-9]");

if (regex.IsMatch(compare))
{ 
    //true
}

必要に応じて、C#と.NET2.0を使用しています。


6
数字数字を一致させる必要がありますか?例:123.456は数字ですが、すべての数字とは限りません。
Joel Coehoorn、2008年

正確には、OPは整数の使用について完全に明確ではありません
Sune Rievers 09/12/12

3
その単純なケースで文字列をTryParseしてみませんか?bool decimal.TryParse(string string、out decimal result)またはbool int.TryParse(string string、out int result)
Makach

正規表現を使用した数値の解析の決定的な扱いについては、この回答をご覧ください。
tchrist

1
一般的に、私の意見では、Regex式のトラブルシューティングを行う最も簡単な方法は、使用言語で許可されている場合(ほとんどの場合そうです)、コマンドラインインタープリターを使用することです。この例はC#にあるため、linqpad.netを使用するか、デバッガーでブレークポイントを使用してから、VSのイミディエイトウィンドウをCLIとして使用できます。
アンドリュー、2015

回答:


478

開始アンカーと終了アンカーを使用します。

Regex regex = new Regex(@"^\d$");

"^\d+$"複数の数字を照合する必要がある場合に使用します。


"\d"一致する[0-9]と東アラビア数字のような他の桁の文字٠١٢٣٤٥٦٧٨٩"^[0-9]+$"一致をアラビア数字0〜9のみに制限するために使用します。


数字以外の数値表現(スターターの10進値など)を含める必要がある場合は、正規表現で数値を解析するため@tchrist包括的なガイドを参照してください。


数値のセット数はどうですか?これは通常、インドなどの特定の国の郵便番号に当てはまります。この後で文字列の長さのチェックをしなければならないかもしれませんね。
Najeeb 2018年

2
@Najeebはい、インドの郵便番号は6桁の数字なので、などを使用できます"^\d{6}$"。他の国では、郵便番号の規則がもっと複​​雑なので、複数の国の正規表現ソリューションもかなり複雑になる可能性があります。stackoverflow.com/q/578406/1288
リザードを請求してください

入力文字列が「3 a」のような場合、どうして一致しますか?数字がある場合にのみ一致させる方法を知っている人はいますが、それ以外は何もありません(私が想定している負の符号を除いて)。現在、「-?[0-9] +」のように設定しています。
マシュー

105

あなたの正規表現は数字を含むすべてのものと一致します。アンカーを使用して文字列全体を一致させ、次に1つ以上の数字を一致させます。

regex = new Regex("^[0-9]+$");

^、文字列の先頭を固定します$文字列の末尾を固定し、+それ(この場合は数)に先行するものの一つ以上にマッチします。


38

小数点と千マーカーを許容する必要がある場合

var regex = new Regex(@"^-?[0-9][0-9,\.]+$");

数値が負になる場合は、「-」が必要です。


@フローリンギタ。ありがとう。「-」は最初にある必要があります。
アンディ

3
この正規表現では、先頭の負符号(-)とピリオド(.)が複数回発生することも誤って許可されています。
DavidRR 2014

5
あなたが作ることができ-.オプションで?-?\d+(?:\.\d+)?整数または小数に一致します。(?:括弧内の括弧は、括弧を非キャプチャグループにし、明確にするためにグループ化のみに使用されます。)
butterywombat '29

2
1、.5のようなエッジケースでは失敗しますが、それを監督する場合は失敗します。それでも、-2のような基本的なケースでは失敗します。^-?[0-9][0-9,\.]*$基本的なケースで失敗しないように変更してください。+は*に置き換えられます
PrivateOmega

ここで見当たらないシナリオの1つは、エンジニアリング表記(1.2345e-4)です。
WolfiG

18

完全な文字列の一致ではなく「一致」を見つけるため、一致しています。これを修正するには、正規表現を変更して、文字列の最初と最後を具体的に探すようにします。

^\d+$

16

多分私の方法があなたを助けるでしょう。

    public static bool IsNumber(string s)
    {
        return s.All(char.IsDigit);
    }

3
ただし、UnicodeCategory.DecimalDigitNumberカテゴリのメンバーであるすべての文字に対してChar.IsDigit返さtrueれることに注意してください。これは、OPが必要とするものではない場合があります。また、intに解析できないcharに対してChar.IsDigitがtrueを返す理由も参照してください
DavidRR 2014


16

これは整数と10進数で機能します。数値にカンマ1000区切り記号がある場合は一致しません。

"^-?\\d*(\\.\\d+)?$"

これと一致するいくつかの文字列:

894
923.21
76876876
.32
-894
-923.21
-76876876
-.32

しないいくつかの文字列:

hello
9bye
hello9bye
888,323
5,434.3
-8,336.09
87078.



10

これが私の働いているものです:

^(-?[1-9]+\\d*([.]\\d+)?)$|^(-?0[.]\\d*[1-9]+)$|^0$

そしていくつかのテスト

肯定的なテスト:

string []goodNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};

否定的なテスト:

string []badNums={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};

C#だけでなく、Java、Javascript、PHPもチェック


「.3」、「3」実際には適切な数値です(それぞれ0.3と3.0を意味します)。これはソースシステムで常に見られ、あなたが言及した言語のほとんどのto_number(xx)関数はそれらを正しく認識して変換します。ありがとう。
Tagar

1
@Ruslanは、多くのシステムで「.3」、「3」のとおりです。有効な数値に解析され、「0.3」と「3.0」のように使用されます。しかし、その一方で、それは変換された値なので、元の値「.3」と「3」です。実際に存在する数ではありません。
マリーナK.

9

醜いフォーマットでごめんなさい。任意の桁数:

[0-9]*

1桁以上の場合:

[0-9]+

7

上記の解決策のどれも私の目的に適合しませんでしたが、これは私にとってはうまくいきました。

var pattern = @"^(-?[1-9]+\d*([.]\d+)?)$|^(-?0[.]\d*[1-9]+)$|^0$|^0.0$";
return Regex.Match(value, pattern, RegexOptions.IgnoreCase).Success;

有効な値の例:「3」、「-3」、「0」、「0.0」、「1.0」、「0.7」、「690.7」、「0.0001」、「-555」、「945465464654」

無効な値の例: "a"、 ""、 ""、 "。"、 "-"、 "001"、 "00.2"、 "000.5"、 "。3"、 "3。"、 "-1" 、「-1」、「-。1」、「-0」、「00099」、「099」


4

別の方法:ペルシア語やアラビア語などの国際番号に一致させる場合は、次の式を使用できます。

Regex = new Regex(@"^[\p{N}]+$");

リテラルのピリオド文字を一致させるには、次のようにします。

Regex = new Regex(@"^[\p{N}\.]+$");


3

整数および浮動小数点数の正規表現:

^[+-]?\d*\.\d+$|^[+-]?\d+(\.\d*)?$

数値はピリオドで開始でき(先頭の数字なし)、数値はピリオドで終了できます(末尾の数字なし)。上記の正規表現は、両方を正しい数値として認識します。

A (ピリオド)数字のないそれ自体は正しい数ではありません。そこで、2つの正規表現の部分が必要です( "|"で区切られています)。

お役に立てれば。


1
これが最も完全なソリューションです。おめでとうございます!
Renato Medeiros

2

これは最も単純なものだと思います。たとえば、ヨーロッパとアメリカの方法で数字を書くことができます。これに加えて、.55や、55のような数値が渡されます。これは便利かもしれません。

^([,|.]?[0-9])+$


-4

正規表現regex =新しい正規表現( "^ [0-9] {1,4} = [0-9] {1,4] $")


5
あなたの答えを少し説明していただけますか?この質問に対する他の回答には、正規表現の各部分の機能についてある程度の説明があり、不足していることに気付くでしょう。
Wai Ha Lee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.