Bagaimana cara mencocokkan karakter non white space kecuali yang tertentu?


111

Di Perl \Scocok dengan karakter non-spasi.

Bagaimana cara mencocokkan karakter non spasi kecuali garis miring terbalik \?

Jawaban:


154

Anda dapat menggunakan kelas karakter :

/[^\s\\]/

cocok dengan apa pun yang bukan karakter spasi atau \. Berikut contoh lainnya:

[abc]berarti "cocok a, batau c"; [^abc]berarti "mencocokkan karakter apa pun kecuali a, batau c".


Kapan ^diartikan sebagai negasi dan kapan sebagai baris awal? Dalam hal ini, mengapa ini tidak cocok dengan garis yang dimulai dengan jumlah spasi$0~/\s*^\s/
Alexander Cska

1
Di luar kelas karakter, itu adalah "awal string" (atau baris, tergantung pada mode pencocokan saat ini). Di dalam kelas karakter, dan hanya jika itu karakter pertama setelah kurung buka, itu meniadakan konten kelas karakter.
Tim Pietzcker

Akankah baris berikut cocok dengan yang diawali dengan jumlah spasi yang $0~/\s*^\s/diikuti oleh karakter yang bukan spasi putih
Alexander Cska

1
Itu mungkin /^\s+/- awal baris, diikuti oleh satu atau lebih karakter spasi.
Tim Pietzcker

1
@AlexanderCska, sudahkah Anda menemukannya? Jawaban di atas hanya akan mengembalikan kecocokan pertama dari sebuah string. Jika Anda ingin semua pertandingan dikembalikan, tambahkan gpengubah. /[^\s\\]/g
Ben Carp

14

Anda bisa menggunakan lookahead:

/(?=\S)[^\\]/

2
Itu terlihat ke depan jika itu bukan spasi. Dan kemudian kelas negatif menerima apapun (yang bukan spasi) kecuali karakter di kelas Anda.
Denis de Bernardy

Saya suka solusi ini. Ini bagus untuk hal-hal seperti "beri saya semua karakter non-kata kecuali spasi":/(?=\S)\W/
jocull

Saya mengalami situasi di mana saya harus mencocokkan karakter non spasi dan bukan tanda kutip. Itu juga harus memungkinkan untuk SPACES. Ex: THIS IS A TEST, AND AGAIN. Berikut ini bekerja dengan baik untuk saya (?=\S)[^"]*.
Arvo Bowen

jawaban yang diterima tidak berhasil untuk saya, tetapi ini berhasil. saya menggunakan ini dalam pencarian regex teks luhur
Christian Noel

5

Ini bekerja untuk saya menggunakan sed [ Sunting: komentar di bawah menunjukkan sed tidak mendukung \ s]

[^ ]

sementara

[^\s] 

tidak

# Delete everything except space and 'g'
echo "ghai ghai" | sed "s/[^\sg]//g"
gg

echo "ghai ghai" | sed "s/[^ g]//g"
g g

3
\scocok lebih dari sekedar karakter spasi. Ini termasuk TAB, linefeed carriage return, dan lainnya (berapa banyak lainnya bergantung pada rasa regex). Ini adalah penemuan Perl, awalnya singkatan dari kelas karakter POSIX [:space:], dan tidak didukung di sed. Regex pertama Anda di atas seharusnya s/[^[:space:]g]//g.
Alan Moore

Yup @AlanMore bekerja: echo "ghai ghai" | sed "s/[^[:space:]g]//g" Hasil:g g
storm_m2138

1

Di sistem saya: CentOS 5

Saya dapat menggunakan di \sluar koleksi tetapi harus menggunakan [:space:]di dalam koleksi. Sebenarnya saya [:space:]hanya bisa menggunakan koleksi di dalam. Jadi untuk mencocokkan satu spasi menggunakan ini saya harus menggunakan [[:space:]] Yang benar-benar aneh.

echo a b cX | sed -r "s/(a\sb[[:space:]]c[^[:space:]])/Result: \1/"

Result: a b cX
  • ruang pertama yang saya cocokkan \s
  • ruang kedua yang saya cocokkan secara alternatif [[:space:]]
  • pencocokan XI dengan "semua kecuali tanpa spasi" [^[:space:]]

Keduanya tidak akan berhasil:

a[:space:]b  instead use a\sb or a[[:space:]]b

a[^\s]b      instead use a[^[:space:]]b

1
Pada sed 4.4, itu tampaknya masih benar bahwa Anda harus menggunakan ([^[:space:]])bukan ([^\s]). Saya menggunakan openSUSE Tumbleweed 2018 04 03.
pengguna2394284
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.