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.

Leon Fedotov
sumber
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.

sleske
sumber
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
303

Akan;

/^(.*?);/

kerja?

Ini ?adalah operator yang malas, sehingga regex meraih sesedikit mungkin sebelum mencocokkan ;.

RJFalconer
sumber
4
ya, tapi mengikuti ekstensi bikarbonat ke Tim Toady, saya percaya kelas karakter yang dinegasikan menang karena quantifier malas termasuk backtraking. Tetap memberi +1.
Amarghosh
3
Layak dibaca tentang topik pertunjukan: blog.stevenlevithan.com/archives/greedy-lazy-performance
Glenn Slaven
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.

Glenn Slaven
sumber
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
15

Mencoba /[^;]*/

Google regex character classesuntuk detailnya.

Dan Breslau
sumber
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;"

poncius
sumber
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
ghostdog74
sumber
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.

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

/^([^;]*);*/
mchid
sumber
3

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

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this
sPooKee
sumber
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.

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

BookerVII
sumber