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

67

В Perl \S соответствует любой символ без пробелов.

Как я могу сопоставить любой символ без пробелов, кроме обратного слэша \?

Теги:

4 ответа

98
Лучший ответ

Вы можете использовать класс :

/[^\s\\]/

соответствует любому символу пробела, а не символу \. Вот еще один пример:

[abc] означает "соответствие a, b или c"; [^abc] означает "соответствовать любому символу, кроме a, b или c".

  • 0
    Когда ^ интерпретируется как отрицание, а когда - как начало строки? В этом отношении, почему это не будет соответствовать строке, начинающейся с числа пробелов $0~/\s*^\s/
  • 1
    За пределами символьного класса это «начало строки» (или строки, в зависимости от текущего режима соответствия). Внутри класса символов, и только если это первый символ после открывающей скобки, он отрицает содержимое класса символов.
Показать ещё 3 комментария
8

Вы можете использовать lookahead:

/(?=\S)[^\\]/
  • 0
    Как это работает?
  • 2
    Он смотрит в будущее, если это не пробел. И тогда отрицательный класс принимает все (кроме пробелов), кроме символов в вашем классе.
Показать ещё 1 комментарий
0

В моей системе: 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:]]
  • X я соответствует "все, но не пробел" [^[: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.
0

Это сработало для меня с помощью комментария 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 .
  • 0
    Да @AlanMoore работает: echo "ghai ghai" | sed "s/[^[:space:]g]//g" Выход: gg

Ещё вопросы

Сообщество Overcoder
Наверх
Меню