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 \?

Lazer
sumber

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

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