Ekspresi reguler untuk memungkinkan spasi antar kata

191

Saya ingin ekspresi reguler yang mencegah simbol dan hanya memungkinkan huruf dan angka. Regex di bawah ini berfungsi dengan baik, tetapi tidak memungkinkan untuk spasi di antara kata-kata.

^[a-zA-Z0-9_]*$

Misalnya, saat menggunakan ungkapan reguler ini, "HelloWorld" baik-baik saja, tetapi "Hello World" tidak cocok.

Bagaimana saya bisa mengubahnya untuk memberikan ruang?

lawphotog
sumber

Jawaban:

372

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 ...

... gunakan jawaban @ stema .

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, \wdan \stidak 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 ditandai, 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 .

Andrew Cheong
sumber
3
itu memungkinkan string kosong
Neha Choudhary
1
Wow, sangat sederhana! Terima kasih. Apakah tidak ada situs atau sesuatu yang dapat digunakan untuk menghasilkan ekspresi regex, untuk noobs yang saya maksud ...
Pierre
1
@Pierre - Cukup sulit untuk mengambil instruksi manusia dan mengubahnya menjadi aturan eksplisit. (Bahasa manusia cair dan penuh ambiguitas, dan otak kita melakukan sebagian besar pekerjaan yang diperlukan untuk menyelesaikan berbagai hal dan mengisi kekosongan. Komputer tidak memiliki otak seperti itu, dan upaya cerdas untuk meniru seseorang belum cukup kuat. ) Ada alat yang ada seperti debuggex.com yang mewakili regex Anda secara visual, tetapi semenarik mungkin tidak sangat membantu bagi pemula yang lengkap. Saya merekomendasikan tutorial interaktif untuk mendapatkan dasar-dasarnya, namun.
Andrew Cheong
1
Ya, regex Anda akan cocok jika hanya ada spasi. Balasan saya adalah komentar Neha choudary.
Rajshekar Reddy
1
@Pierre Tiga tahun kemudian - saya menemukan pertanyaan ini hari ini, melihat komentar Anda; Saya menggunakan pahlawan regex ( regexhero.net ) untuk menguji ekspresi reguler. Saya pikir versi online hanya berfungsi di Internet Explorer dengan Silverlight tetapi lebih baik daripada tidak sama sekali.
Michael Armes
122

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 \wini dalam kebanyakan rasa regex sama dari [a-zA-Z0-9_](dalam beberapa itu berbasis Unicode)

^\w+( \w+)*$

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 string

stema
sumber
Ini: regex101.com/#javascript juga memberikan penjelasan yang bagus untuk pola regex yang ingin Anda analisis.
Dark Star1
Nice Regex, jauh lebih sederhana daripada banyak [0-9a-z] dll
George
Saya menemukan di penerjemah regex saya bahwa saya perlu membungkus seluruh string dalam tanda kurung agar pertandingan pertama menjadi seluruh string, dan bukan hanya kata-kata yang muncul setelah spasi pertama. Itu ^- (\w+( \w+)*)$berhasil bagi saya.
NoseKnowsSemua
26

Yang ini berhasil untuk saya

([\w ]+)
Mario Rugeles Perez
sumber
1
Jawaban ini tidak memiliki penjelasan.
mickmackusa
12

Coba dengan:

^(\w+ ?)*$

Penjelasan:

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional
hsz
sumber
2
Ini akan mendorong mundurnya neraka.
nhahtdh
1
Misalnya, mengingat string yang tidak cocok ggggggggggggggggggggggggggggggggggggg;, regex Anda akan memakan waktu sangat lama untuk mencapai hasil karena pengulangan yang berlebihan.
nhahtdh
Ok, jadi apa yang Anda sarankan?
hsz
7

Saya berasumsi Anda tidak ingin memimpin / mengikuti ruang. Ini berarti Anda harus membagi regex menjadi "karakter pertama", "barang di tengah" dan "karakter terakhir":

^[a-zA-Z0-9_][a-zA-Z0-9_ ]*[a-zA-Z0-9_]$

atau jika Anda menggunakan sintaks seperti perl:

^\w[\w ]*\w$

Juga: Jika Anda dengan sengaja menambahkan regex Anda bahwa itu juga memungkinkan String kosong, Anda harus menjadikan semuanya opsional:

^(\w[\w ]*\w)?$

Jika Anda hanya ingin membolehkan satu karakter spasi, tampilannya sedikit berbeda:

^((\w+ )*\w+)?$

Ini cocok dengan 0..n kata yang diikuti oleh satu spasi, ditambah satu kata tanpa spasi. Dan menjadikan semuanya opsional untuk memungkinkan string kosong.

creinig
sumber
Ruang dan \stidak setara. \scocok lebih dari sekadar ruang.
nhahtdh
@nhahtdh: Terima kasih atas komentarnya. Saya terlalu terbiasa dengan pencocokan spasi putih secara umum saya kira .. Jawaban sudah diperbaiki.
creinig
Apakah mungkin bahwa Anda kehilangan tanda kurung penutup) pada ekspresi pertama? Saya tidak yakin saya tidak mencobanya.
ssinfod
@ssinfod: Tangkapan bagus. Sebenarnya tanda kurung pembuka berlebihan dalam contoh itu. Terima kasih.
creinig
4

Ekspresi reguler ini

^\w+(\s\w+)*$

hanya akan memungkinkan satu ruang antara kata-kata dan tidak ada spasi awal atau spasi tambahan.

Di bawah ini adalah penjelasan dari ekspresi reguler:

  1. ^ Menegaskan posisi di awal string
  2. \w+ Cocok dengan karakter kata apa pun [a-zA-Z0-9_]
    1. Kuantifikasi: +Antara satu dan tidak terbatas kali, sebanyak mungkin, memberikan kembali sesuai kebutuhan [serakah]
  3. Grup Menangkap 1 (\s\w+)*
    1. Kuantifikasi: *Antara nol dan waktu tanpa batas, sebanyak mungkin, memberikan kembali sesuai kebutuhan [serakah]
    2. \s Cocokkan karakter spasi apa pun [\r\n\t\f ]
    3. \w+ Cocok dengan karakter kata apa pun [a-zA-Z0-9_]
      1. Kuantifikasi: +Antara satu dan tidak terbatas kali, sebanyak mungkin, memberikan kembali sesuai kebutuhan [serakah]
  4. $ Tunjukkan posisi di akhir string
Amadeus Sánchez
sumber
2

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.

\w+.*$
Jaxxbo
sumber
Jawaban ini salah / tidak akurat. Pola ini cocok dengan satu atau lebih alfanumerik, garis bawah, lalu nol atau lebih dari karakter non-baris baru. Tidak bagus untuk OP.
mickmackusa
2

Hanya untuk huruf:

^([a-zA-Z])+(\s)+[a-zA-Z]+$

Untuk nilai alfanumerik dan _:

^(\w)+(\s)+\w+$
bibliophilsagar
sumber
1
itu bukan contoh yang baik, karena (sesuatu) + tidak sama dengan (sesuatu +). Dalam contoh pertama, hanya karakter tunggal yang akan ditangkap sebagai $ 1.
Znik
0

Coba ini: (versi Python)

"(A-Za-z0-9 ){2, 25}"

ubah batas atas berdasarkan kumpulan data Anda

MoMo
sumber
0

Cukup tambahkan spasi untuk mengakhiri pola regex Anda sebagai berikut:

[a-zA-Z0-9_ ]
KayV
sumber
-1

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.

^[a-zA-Z]+[(?<=\d\s]([a-zA-Z]+\s)*[a-zA-Z]+$

Dengan demikian mudah dimodifikasi menjadi alfanumerik:

^[a-zA-Z0-9]+[(?<=\d\s]([a-zA-Z0-9]+\s)*[a-zA-Z0-9]+$

(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

LokizFenrir
sumber
3
[(?<=\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.
Alan Moore
Untuk pemberi suara: Tolong jangan hapus solusi yang salah. Mereka membingungkan pengguna lain dan membuat mereka percaya regex dapat melakukan hal-hal yang tidak diinginkan.
Wiktor Stribiżew
-1

Saya menemukan ini berfungsi dengan baik untuk "Nama Lengkap":

([a-z',.-]+( [a-z',.-]+)*){1,70}/
Adam K. Dean
sumber
-4

coba. *? untuk memungkinkan ruang putih bekerja untuk saya

pengguna4035152
sumber
Itu karena .cocok dengan semuanya. Ini sangat mungkin bukan solusi di sini.
rubik
itu cocok dengan nol atau karakter apa pun, tergantung pada apa yang sebelum dan sesudah urutan ini. ini akan cocok dengan sesedikit mungkin. titik tunggal mewakili setiap karakter tunggal.
Znik