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


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.