Как сопоставить любой непробельный символ, кроме определенного?


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

Вы можете использовать опережающий просмотр:

/(?=\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.
— Алан Мур

Да, @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
Что касается sed 4.4, очевидно, что вы должны использовать ([^[:space:]])вместо ([^\s]). Я использую openSUSE Tumbleweed 2018 04 03.
— user2394284
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.