Jawaban:
Gunakan yang berikut ini:
/^\d*\.?\d*$/
^
- Awal baris;\d*
- 0 atau lebih digit;\.?
- Titik opsional (di-escape, karena dalam regex, .
adalah karakter khusus);\d*
- 0 atau lebih digit (bagian desimal);$
- Akhir garis.Ini memungkinkan untuk 0,5 desimal daripada membutuhkan nol di depannya, seperti 0,5
/^\d*\.?\d+$/
akan memaksa angka setelah koma desimal.
/\d+\.?\d*/
Satu atau lebih digit ( \d+
), titik opsional ( \.?
), nol atau lebih digit ( \d*
).
Bergantung pada penggunaan atau mesin regex Anda, Anda mungkin perlu menambahkan jangkar garis awal / akhir:
/^\d+\.?\d*$/
.
dengan string kosong dan keduanya .
-
sama sekali.
Anda memerlukan ekspresi reguler seperti berikut untuk melakukannya dengan benar:
/^[+-]?((\d+(\.\d*)?)|(\.\d+))$/
Ekspresi yang sama dengan spasi, menggunakan pengubah diperpanjang (seperti yang didukung oleh Perl):
/^ [+-]? ( (\d+ (\.\d*)?) | (\.\d+) ) $/x
atau dengan komentar:
/^ # Beginning of string
[+-]? # Optional plus or minus character
( # Followed by either:
( # Start of first option
\d+ # One or more digits
(\.\d*)? # Optionally followed by: one decimal point and zero or more digits
) # End of first option
| # or
(\.\d+) # One decimal point followed by one or more digits
) # End of grouping of the OR options
$ # End of string (i.e. no extra characters remaining)
/x # Extended modifier (allows whitespace & comments in regular expression)
Misalnya, ini akan cocok dengan:
Dan akan menolak non-angka ini:
Solusi yang lebih sederhana dapat salah menolak angka yang valid atau mencocokkan bukan angka ini.
^A?(B|C)$
. Sebelumnya, ditulis seperti ^A?B|C$
yang sebenarnya berarti (^A?B)|(C$)
mana yang salah. Catatan: ^(A?B|C)$
juga salah, karena itu sebenarnya berarti ^((A?B)|(C))$
mana yang tidak cocok dengan "+.5".
Coba regex ini:
\d+\.?\d*
\ d + digit sebelum desimal opsional
.? desimal opsional (opsional karena? pembilang)
\ d * digit opsional setelah desimal
123.
Saya pikir ini yang terbaik karena sesuai dengan semua persyaratan:
^\d+(\\.\d+)?$
Saya akhirnya menggunakan yang berikut:
^\d*\.?\d+$
Ini membuat hal-hal berikut tidak valid:
.
3.
.3
Anda dapat menggunakan ini:
^\d+(\.\d)?\d*$
pertandingan:
11
11.1
0.2
tidak cocok:
.2
2.
2.6.9
Inilah yang saya lakukan. Ini lebih ketat dari yang manapun di atas (dan lebih benar dari beberapa):
^0$|^[1-9]\d*$|^\.\d+$|^0\.\d*$|^[1-9]\d*\.\d*$
String yang lolos:
0
0.
1
123
123.
123.4
.0
.0123
.123
0.123
1.234
12.34
String yang gagal:
.
00000
01
.0.
..
00.123
02.134
^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$
harus mencerminkan apa yang biasanya orang anggap sebagai bilangan desimal yang dibentuk dengan baik.
Digit sebelum koma desimal dapat berupa satu digit, dalam hal ini bisa dari 0 hingga 9, atau lebih dari satu digit, dalam hal ini tidak boleh dimulai dengan 0.
Jika ada angka sebelum tanda desimal, maka desimal dan angka setelahnya adalah opsional. Jika tidak, desimal harus ada diikuti oleh setidaknya satu digit. Perhatikan bahwa beberapa tanda 0 diperbolehkan setelah titik desimal.
grep -E '^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$'
cocok dengan yang berikut ini:
9
0
10
10.
0.
0.0
0.100
0.10
0.01
10.0
10.10
.0
.1
.00
.100
.001
serta padanan bertanda tangan mereka, sedangkan menolak hal-hal berikut:
.
00
01
00.0
01.3
dan padanannya yang bertanda, serta string kosong.
(?<![^d])\d+(?:\.\d+)?(?![^d])
bersih dan sederhana.
Ini menggunakan Suffix dan Prefix, fitur RegEx.
Ini secara langsung mengembalikan true - false untuk kondisi IsMatch
^\d+(()|(\.\d+)?)$
Datang dengan ini. Mengizinkan bilangan bulat dan desimal, tetapi memaksa desimal lengkap (angka di depan dan di belakang) jika Anda memutuskan untuk memasukkan desimal.
Apa yang Anda tanyakan sudah dijawab jadi ini hanya info tambahan bagi mereka yang hanya menginginkan 2 digit desimal jika titik desimal opsional dimasukkan:
^\d+(\.\d{2})?$
^: awal string
\ d: digit (sama dengan [0-9])
+: satu dan waktu tak terbatas
Menangkap Grup (. \ D {2})?
? : nol dan satu kali. : karakter.
\ d: digit (sama dengan [0-9])
{2}: tepat 2 kali
$: akhir string
1: pertandingan
123: pertandingan
123.00: pertandingan
123
.: tidak ada pertandingan
123 ..: tidak ada pertandingan
123.0: tidak ada pertandingan
123.000: tidak ada pertandingan
123.00.00: tidak ada pertandingan
Di Perl, gunakan Regexp :: Common yang memungkinkan Anda menyusun ekspresi reguler yang disetel dengan tepat untuk format bilangan tertentu. Jika Anda tidak menggunakan Perl, ekspresi reguler yang dihasilkan biasanya masih dapat digunakan oleh bahasa lain.
Mencetak hasil dari menghasilkan contoh ekspresi reguler di Regexp :: Common :: Number:
$ perl -MRegexp::Common=number -E 'say $RE{num}{int}'
(?:(?:[-+]?)(?:[0123456789]+))
$ perl -MRegexp::Common=number -E 'say $RE{num}{real}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)(?:[0123456789]+))|))
$ perl -MRegexp::Common=number -E 'say $RE{num}{real}{-base=>16}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789ABCDEF])(?:[0123456789ABCDEF]*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[-+]?)(?:[0123456789ABCDEF]+))|))
coba ini. ^[0-9]\d{0,9}(\.\d{1,3})?%?$
itu diuji dan bekerja untuk saya.