tl; dr
Cukup tambahkan spasi di kelas karakter Anda .
^[a-zA-Z0-9_ ]*$
Sekarang, jika Anda ingin menjadi ketat ...
Di atas tidak sepenuhnya benar. Karena kenyataan itu *
berarti nol atau lebih , itu akan cocok dengan semua kasus berikut yang biasanya tidak cocok dengan orang:
- String kosong, "".
- String seluruhnya terdiri dari spasi, "".
- String yang mengarah dan / atau mengikuti spasi, "Hello World".
- String yang berisi beberapa spasi di antara kata-kata, "Hello World".
Awalnya saya tidak berpikir perincian seperti itu layak untuk dibahas, karena OP mengajukan pertanyaan mendasar sedemikian rupa sehingga kelihatannya tidak ketat. Sekarang pertanyaannya mendapatkan popularitas namun, saya ingin mengatakan ...
Yang, menurut selera saya (tanpa menggunakan \w
) diterjemahkan menjadi:
^[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)*$
(Harap pilih @stema tanpa memperhatikan.)
Beberapa hal yang perlu diperhatikan tentang jawaban ini (dan @ stema):
Jika Anda ingin mengizinkan beberapa spasi di antara kata-kata (katakanlah, jika Anda ingin mengizinkan spasi ganda yang tidak disengaja, atau jika Anda bekerja dengan teks yang disalin dari PDF), maka tambahkan a +
setelah spasi:
^\w+( +\w+)*$
Jika Anda ingin membolehkan tab dan baris baru (karakter spasi putih), maka ganti spasi dengan \s+
:
^\w+(\s+\w+)*$
Di sini saya menyarankan +
secara default karena, misalnya, Windows linebreak terdiri dari dua karakter spasi putih secara berurutan \r\n
, sehingga Anda perlu +
menangkap keduanya.
Masih tidak bekerja?
Periksa dialek ekspresi reguler apa yang Anda gunakan. * Dalam bahasa seperti Java Anda harus melarikan diri dari garis miring terbalik, yaitu \\w
dan \\s
. Dalam bahasa dan utilitas yang lebih tua atau lebih dasar, seperti sed
, \w
dan \s
tidak didefinisikan, maka tuliskan masing-masing dengan kelas karakter, misalnya [a-zA-Z0-9_]
dan [\f\n\p\r\t]
, masing-masing.
* Saya tahu pertanyaan ini ditandaivb.net, tetapi berdasarkan 25.000+ tampilan, saya kira bukan hanya orang-orang yang menemukan pertanyaan ini. Saat ini adalah hit pertama di google untuk frasa pencarian, kata ruang ekspresi reguler .
Satu kemungkinan adalah dengan menambahkan spasi ke dalam kelas karakter Anda, seperti yang disarankan acheong87, ini tergantung pada seberapa ketat Anda pada pola Anda, karena ini juga akan memungkinkan string dimulai dengan 5 spasi, atau string yang hanya terdiri dari ruang.
Kemungkinan lain adalah mendefinisikan pola:
Saya akan menggunakan
\w
ini dalam kebanyakan rasa regex sama dari[a-zA-Z0-9_]
(dalam beberapa itu berbasis Unicode)Ini akan memungkinkan serangkaian setidaknya satu kata dan kata-kata dibagi dengan spasi.
^
Cocokkan dengan awal string\w+
Cocokkan serangkaian karakter kata setidaknya satu( \w+)*
adalah grup yang diulang 0 kali atau lebih. Dalam grup itu mengharapkan ruang diikuti oleh serangkaian setidaknya satu karakter kata$
cocok dengan akhir stringsumber
^- (\w+( \w+)*)$
berhasil bagi saya.Yang ini berhasil untuk saya
sumber
Coba dengan:
Penjelasan:
sumber
ggggggggggggggggggggggggggggggggggggg;
, regex Anda akan memakan waktu sangat lama untuk mencapai hasil karena pengulangan yang berlebihan.Saya berasumsi Anda tidak ingin memimpin / mengikuti ruang. Ini berarti Anda harus membagi regex menjadi "karakter pertama", "barang di tengah" dan "karakter terakhir":
atau jika Anda menggunakan sintaks seperti perl:
Juga: Jika Anda dengan sengaja menambahkan regex Anda bahwa itu juga memungkinkan String kosong, Anda harus menjadikan semuanya opsional:
Jika Anda hanya ingin membolehkan satu karakter spasi, tampilannya sedikit berbeda:
Ini cocok dengan 0..n kata yang diikuti oleh satu spasi, ditambah satu kata tanpa spasi. Dan menjadikan semuanya opsional untuk memungkinkan string kosong.
sumber
\s
tidak setara.\s
cocok lebih dari sekadar ruang.Ekspresi reguler ini
hanya akan memungkinkan satu ruang antara kata-kata dan tidak ada spasi awal atau spasi tambahan.
Di bawah ini adalah penjelasan dari ekspresi reguler:
^
Menegaskan posisi di awal string\w+
Cocok dengan karakter kata apa pun[a-zA-Z0-9_]
+
Antara satu dan tidak terbatas kali, sebanyak mungkin, memberikan kembali sesuai kebutuhan [serakah](\s\w+)*
*
Antara nol dan waktu tanpa batas, sebanyak mungkin, memberikan kembali sesuai kebutuhan [serakah]\s
Cocokkan karakter spasi apa pun[\r\n\t\f ]
\w+
Cocok dengan karakter kata apa pun[a-zA-Z0-9_]
+
Antara satu dan tidak terbatas kali, sebanyak mungkin, memberikan kembali sesuai kebutuhan [serakah]$
Tunjukkan posisi di akhir stringsumber
Ini tidak memungkinkan ruang di awal. Tetapi memungkinkan ruang di antara kata-kata. Juga memungkinkan karakter khusus antar kata. Regex yang bagus untuk bidang FirstName dan LastName.
sumber
Hanya untuk huruf:
Untuk nilai alfanumerik dan
_
:sumber
Coba ini: (versi Python)
ubah batas atas berdasarkan kumpulan data Anda
sumber
Cukup tambahkan spasi untuk mengakhiri pola regex Anda sebagai berikut:
sumber
Telah melihat banyak jawaban yang seharusnya ...
... dan bupkis setelah menjelajahi Stack Overflow serta situs lain untuk regex yang cocok dengan string apa pun tanpa awal atau jejak spasi putih dan hanya satu ruang tunggal di antara kata-kata karakter alfa yang ketat.
Dengan demikian mudah dimodifikasi menjadi alfanumerik:
(Ini tidak cocok dengan satu kata tetapi hanya menggunakan switch / jika-lain dengan sederhana
^[a-zA-Z0-9]+$
jika Anda perlu menangkap kata-kata tambahan.)nikmati: D
sumber
[(?<=\d\s]
cocok dengan salah satu karakter:(
,?
,<
,=
, angka, atau karakter spasi, dan yang tidak dapat menjadi apa yang Anda maksud. Jika itu seharusnya terlihat di belakang, itu seharusnya(?<=\d\s)
, tetapi tidak masuk akal di sana; regex tidak akan pernah cocok.Saya menemukan ini berfungsi dengan baik untuk "Nama Lengkap":
sumber
coba. *? untuk memungkinkan ruang putih bekerja untuk saya
sumber
.
cocok dengan semuanya. Ini sangat mungkin bukan solusi di sini.