web-dev-qa-db-ja.com

Javaの10進数の正規表現とは何ですか?

私は、Javaの期間の正しい正規表現が何であるかについてはよくわかりません。ここに私の試みのいくつかがあります。悲しいことに、それらはすべて任意の文字を意味しました。

String regex = "[0-9]*[.]?[0-9]*";
String regex = "[0-9]*['.']?[0-9]*";
String regex = "[0-9]*["."]?[0-9]*";
String regex = "[0-9]*[\.]?[0-9]*";
String regex = "[0-9]*[\\.]?[0-9]*";
String regex = "[0-9]*.?[0-9]*";
String regex = "[0-9]*\.?[0-9]*";
String regex = "[0-9]*\\.?[0-9]*";

しかし、私が欲しいのは実際の "。"です。キャラクター自体。誰かがアイデアを持っていますか?

私が実際にやろうとしているのは、負でない実数(10進数を許可)の正規表現を書き出すことです。したがって、可能性は次のとおりです:12.2、3.7、2。、0.3、.89、19

String regex = "[0-9]*['.']?[0-9]*";
Pattern pattern = Pattern.compile(regex);

String x = "5p4";
Matcher matcher = pattern.matcher(x);
System.out.println(matcher.find());

最後の行はfalseを出力するはずですが、とにかくtrueを出力します。私の正規表現は間違っていると思います。

4
Gian Alix

更新

負でない10進数に一致させるには、次の正規表現が必要です。

^\d*\.\d+|\d+\.\d*$

またはJava構文:"^\\d*\\.\\d+|\\d+\\.\\d*$"

String regex = "^\\d*\\.\\d+|\\d+\\.\\d*$"
String string = "123.43253";

if(string.matches(regex))
    System.out.println("true");
else
    System.out.println("false");

元の正規表現の試みの説明:

[0-9]*\.?[0-9]*

Javaエスケープを使用すると、次のようになります。

"[0-9]*\\.?[0-9]*";

ドットを必須にする必要がある場合は、?マーク:

[0-9]*\.[0-9]*  

しかし、これは数字のないドットも受け入れます...したがって、検証で数字を必須と見なしたい場合は、*(0以上)の代わりに+(1以上)を使用します。その場合、次のようになります。

[0-9]+\.[0-9]+
4
Rizwan M.Tuman

Kotlinを使用している場合は、ktxを使用します。

fun String.findDecimalDigits() =
    Pattern.compile("^[0-9]*\\.?[0-9]*").matcher(this).run { if (find()) group() else "" }!!
0
Serg Burlaka

あなたの最初の理解はおそらく正しいですが、matcher.find()を使用すると、正規表現が文字列内の最初の有効な一致を見つけ、例のallが長さゼロの文字列。

"^([0-9]+\\.?[0-9]*|[0-9]*\\.[0-9]+)$"をお勧めします

0
phatfingers

リテラル.を照合するには、実際には2つの方法があります。 1つは\\.と同じようにバックスラッシュエスケープを使用する方法で、もう1つは[.]のように文字クラスまたは角括弧で囲む方法です。 ほとんどの特殊文字は角括弧内のリテラル文字になります.を含みます。したがって、文字どおりのドット\\.に一致させることだけが目的の場合、[.]を使用すると、.よりも意図が明確に示されます。これを表す複数のものに一致させる必要がある場合は[]を使用しますorたとえば、この正規表現[\\d.]は1桁またはリテラルドットに一致することを意味します

0
Teedeez