Regex: cocok dengan kemunculan pertama karakter


358

Saya mencari pola yang cocok dengan semuanya sampai kemunculan pertama karakter tertentu, katakanlah ";" - titik koma .

Saya menulis ini:

/^(.*);/

Tetapi sebenarnya cocok dengan semuanya (termasuk titik koma) sampai kemunculan terakhir titik koma.


65
/^(.*?);/seharusnya juga berfungsi (ini disebut non-serakah ), tetapi jawaban yang diberikan [^;]*lebih baik.
Pascal

bagaimana Anda memilih semuanya, setelah titik koma, dan bukan titik koma itu sendiri.
Muhammad Umer

lihat ini bekerja \w+(?!([^]+;)|;)tetapi ini tidak mengapa? .+(?!([^]+;)|;)
Muhammad Umer

1
Pascal, Anda seharusnya menulis itu sebagai jawaban!
Sean Kendle

@ Pascal Ini cocok sebagai jawaban! Terima kasih!
neverMind9

Jawaban:


503

Kamu butuh

/[^;]*/

Ini [^;]adalah kelas karakter , cocok dengan semua kecuali titik koma.

Untuk mengutip halaman perlremanual:

Anda dapat menentukan kelas karakter, dengan melampirkan daftar karakter di [], yang akan cocok dengan karakter apa pun dari daftar. Jika karakter pertama setelah "[" adalah "^", kelas cocok dengan karakter apa pun yang tidak ada dalam daftar.

Ini harus bekerja di sebagian besar dialek regex.


Bagian terbaik dari solusi ini adalah yang juga cocok dengan akhir baris, misalnya dalam kasus saya yang saya miliki foo=bar;baz=bax;bab=bafdan cocok bab=bafbahkan tidak ada ;apa yang saya butuhkan. Tidak yakin mengapa ini bekerja meskipun jika spec mengatakan cocok dengan semua kecuali simbol target ...
skryvets


38

/^[^;]*/

[^;] Mengatakan cocok dengan apa pun kecuali titik koma. Kurung kuadrat adalah operator pencocokan himpunan, pada dasarnya cocok dengan karakter apa pun dalam himpunan karakter ini, ^pada awalnya menjadikannya kecocokan terbalik, jadi cocokkan apa pun yang tidak ada dalam himpunan ini.


3
Ketahuilah bahwa yang pertama ^ dalam jawaban ini memberi regex arti yang sama sekali berbeda: Itu membuat ekspresi reguler hanya mencari kecocokan yang dimulai dari awal string. Dalam hal ini, itu akan secara efektif menjadi larangan jika Anda menjalankan ekspresi reguler hanya sekali. Jika Anda ingin mencari beberapa kecocokan dalam satu string, ^ pertama harus digunakan.
Dan Breslau

4
Dia memang mengatakan bahwa dia ingin mencocokkan segalanya sampai kemunculan pertama titik koma, jadi saya berasumsi bahwa yang dia maksudkan adalah dari awal string.
Glenn Slaven



8

contoh teks:

"this is a test sentence; to prove this regex; that is g;iven below"

Jika misalnya kita memiliki contoh teks di atas, regex /(.*?\;)/akan memberi Anda segalanya sampai kemunculan pertama titik koma ( ;), termasuk titik koma:"this is a test sentence;"


3
tidak perlu untuk melarikan diri ;char karena itu bukan regex karakter khusus. Pengelompokan ()tidak diperlukan juga. Anda dapat pergi dengan/.*?;/
Aliaksei Kliuchnikau

1
ya kamu benar. pelarian itu lebih seperti "lebih baik aman daripada menyesal"
poncius

2
Ini jawaban yang saya cari. Sehingga ? membuat pertandingan berakhir pada kemunculan pertama? Apa nama properti ini ... (sebut saja) dari regex?
Parziphal

1
@Parziphal ?karakter membuat pertandingan menjadi malas (cocok sesering mungkin). Pikirkan karakter pencocokan regex hingga titik koma pertama, maka itu tidak berjalan lebih jauh karena menyerah (malas;))
derekantrican

5

ini bukan solusi regex, tetapi sesuatu yang cukup sederhana untuk deskripsi masalah Anda. Pisahkan string Anda dan dapatkan item pertama dari array Anda.

$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];

keluaran

$ php test.php
match everything until first

5

Ini sangat membantu bagi saya karena saya mencoba mencari cara untuk mencocokkan semua karakter dalam tag xml termasuk atribut. Saya mengalami masalah "cocokkan semuanya sampai akhir" dengan:

/<simpleChoice.*>/

tetapi dapat menyelesaikan masalah dengan:

/<simpleChoice[^>]*>/

setelah membaca posting ini. Terima kasih semuanya.


1
Saya telah menemukan bahwa itu jauh lebih efisien untuk benar-benar parse (setiap bahasa atau kerangka kerja memiliki kelas sendiri untuk itu) html / xml karena format mesin itu, regex adalah untuk bahasa alami.
Leon Fedotov

1
Bagus. Saya menggunakan ini untuk memperbaiki dokumen xml dengan kesalahan sintaks pada <!DOCTYPE>tag. Karena parser tidak dapat menanganinya.
Martin Schneider

5

Ini akan cocok dengan kejadian pertama hanya di setiap string dan akan mengabaikan kejadian berikutnya.

/^([^;]*);*/

3

"/^([^\/]*)\/$/" bekerja untuk saya, untuk mendapatkan hanya "folder" teratas dari array seperti:

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this

2

Benar-benar agak sedih karena tidak ada yang memberi Anda jawaban yang benar ....

Di regex,? membuatnya tidak serakah. Secara default regex akan cocok sebanyak mungkin (serakah)

Cukup tambahkan? dan itu akan menjadi serakah dan serasi sesedikit mungkin!

Semoga sukses, semoga bisa membantu.


3
Ini sangat tergantung pada implementasi regex yang sebenarnya dan tidak setiap implementasi memiliki mode non-serakah.
karatedog

0

Saya menemukan itu

/^[^,]*,/

bekerja dengan baik.

',' menjadi "pembatas" di sini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.