Як зіставити будь-який небілий пробіл, крім конкретного?


111

У Perl \Sвідповідає будь-якому символу без пробілів.

Як я можу зіставити будь-який символ, який не є пробілом, окрім зворотної косої риси \?

Відповіді:


154

Ви можете використовувати клас символів :

/[^\s\\]/

відповідає будь-якому, що не є символом пробілу і не \. Ось ще один приклад:

[abc]означає "збіг a, bабо c"; [^abc]означає "відповідати будь-якому символу, крім" a, bабо c".


Коли ^трактується як заперечення, а коли як початок рядка? У цьому відношенні, чому цей звичай відповідає лінії, що починається з кількості пробілів,$0~/\s*^\s/
Олександр Цска

1
Поза класом символів це "початок рядка" (або рядок, залежно від поточного режиму відповідності). Всередині класу символів, і лише якщо він є першим символом після відкриття дужки, він заперечує вміст класу символів.
Тім Піцкер

Чи буде наступна лінія поєдинку, яка починається з ряду пробілів, $0~/\s*^\s/а за ними будь-який символ, який не є пробілами,
Олександр Цска,

1
Мабуть, це має бути /^\s+/- початок рядка, за яким слід один або кілька символів пробілу.
Тім Піцкер

1
@AlexanderCska, ти це зрозумів? Наведена відповідь поверне лише першу відповідність рядка. Якщо ви хочете, щоб всі збіги були повернені, додайте gмодифікатор. /[^\s\\]/g
Бен Карп

14

Ви можете скористатися lookahead:

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

2
Він дивиться вперед, якщо це не пробіл. І тоді негативний клас приймає що-небудь (що не є пробілом), крім символів у вашому класі.
Денис де Бернарді

Мені подобається це рішення. Це добре для таких речей, як "дай мені всі символи без слова, крім пробілів":/(?=\S)\W/
Jocull

У мене виникла ситуація, коли мені потрібно було відповідати будь-які символи пробілу, а також не цитати. Це також повинно було дозволити МІСЦЕ. Приклад: THIS IS A TEST, AND AGAIN. Наступне добре працювало для мене (?=\S)[^"]*.
Арво Боуен

прийнята відповідь не працювала для мене, але це було. я використовував це в пошуку піднесеного текстового регексу
Крістіан Ноель,

5

Це працювало для мене за допомогою sed [ Редагувати: коментар нижче вказує, що sed не підтримує \ s]

[^ ]

поки

[^\s] 

не став

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

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

3
\sвідповідає більше, ніж просто космічний персонаж. Вона включає в себе TAB, переклад рядка повернення каретки, і інший (як багато інші , залежать від регулярного виразу смаку). Це винахід Perl, спочатку це стенограма для класу символів POSIX [:space:], і не підтримується в sed. Вашим першим регексом має бути вище s/[^[:space:]g]//g.
Алан Мур

Yup @AlanMoore працює: echo "ghai ghai" | sed "s/[^[:space:]g]//g" Врожайність:g g
storm_m2138

1

У моїй системі: CentOS 5

Я можу використовувати \sпоза колекціями, але мушу використовувати [:space:]всередині колекцій. Насправді я можу використовувати [:space:]лише всередині колекцій. Отже, щоб відповідати одному простору, використовуючи це, я повинен використовувати [[:space:]] Що насправді дивно.

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

Result: a b cX
  • Перший пробіл, з яким я співпадаю \s
  • другий простір, з яким я співпадаю [[:space:]]
  • збіг XI з "усіма, але не місця" [^[:space:]]

Ці два не працюватимуть:

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

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

1
Щодо седу 4.4, мабуть, все-таки вірно, що ви повинні використовувати ([^[:space:]])замість цього ([^\s]). Я на openSUSE Tumbleweed 2018 04 03.
користувач2394284
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.