Como combinar qualquer caractere diferente de espaço em branco, exceto um específico?

111

Em Perl \Scorresponde a qualquer caractere sem espaço em branco.

Como posso combinar qualquer caractere diferente de espaço em branco, exceto uma barra invertida \?

lazer
fonte

Respostas:

154

Você pode usar uma classe de personagem :

/[^\s\\]/

corresponde a qualquer coisa que não seja um caractere de espaço em branco nem a \. Aqui está outro exemplo:

[abc]meios "match a, bou c"; [^abc]significa "corresponder a qualquer caractere exceto a, bou c".

Tim Pietzcker
fonte
Quando é ^interpretado como negação e quando como início de linha? A esse respeito, por que isso não vai corresponder a uma linha começando com o número de espaços em branco$0~/\s*^\s/
Alexander Cska
1
Fora de uma classe de caractere, é o "início da string" (ou linha, dependendo do modo de correspondência atual). Dentro de uma classe de caractere, e somente se for o primeiro caractere após o colchete de abertura, ele nega o conteúdo da classe de caractere.
Tim Pietzcker
A seguinte linha de correspondência que começa com um número de espaços em branco $0~/\s*^\s/seguido por qualquer caractere que não seja um espaço em branco
Alexander Cska
1
Isso provavelmente deve ser /^\s+/- início da linha, seguido por um ou mais caracteres de espaço em branco.
Tim Pietzcker
1
@AlexanderCska, você descobriu? A resposta acima retornará apenas a primeira correspondência de uma string. Se você deseja que todas as correspondências sejam retornadas, adicione o gmodificador. /[^\s\\]/g
Ben Carp
14

Você pode usar um lookahead:

/(?=\S)[^\\]/
Denis de Bernardy
fonte
2
Olha pra frente se não for um espaço. E então a classe negativa aceita qualquer coisa (que não seja um espaço), exceto os personagens de sua classe.
Denis de Bernardy
Eu gosto dessa solução. É bom para coisas como "dê-me todos os caracteres que não sejam palavras, exceto espaços em branco":/(?=\S)\W/
jocull
Tive uma situação em que precisava corresponder a qualquer caractere diferente de espaço em branco, bem como a não aspas. Também teve que permitir ESPAÇOS. Ex: THIS IS A TEST, AND AGAIN. O seguinte funcionou bem para mim (?=\S)[^"]*.
Arvo Bowen
a resposta aceita não funcionou para mim, mas funcionou. eu estava usando isso em uma pesquisa regex de texto sublime
Christian Noel
5

Isso funcionou para mim usando sed [ Editar: o comentário abaixo aponta que o sed não é compatível com \ s]

[^ ]

enquanto

[^\s] 

não

# 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
fonte
3
\scorresponde a mais do que apenas o caractere de espaço. Ele inclui TAB, retorno de carro alimentação de linha, e outros (como muitos outros depende do sabor de regex). É uma invenção do Perl, originalmente uma abreviação para a classe de caracteres POSIX [:space:], e não tem suporte em sed. Seu primeiro regex acima deve ser s/[^[:space:]g]//g.
Alan Moore
Yup @AlanMoore funciona: Rende echo "ghai ghai" | sed "s/[^[:space:]g]//g" :g g
storm_m2138 de
1

No meu sistema: CentOS 5

Posso usar \sfora das coleções, mas tenho que usar [:space:]dentro das coleções. Na verdade, só posso usar [:space:]dentro de coleções. Então, para combinar um único espaço usando isso, eu tenho que usar o [[:space:]] que é realmente estranho.

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

Result: a b cX
  • primeiro espaço que eu combino \s
  • segundo espaço eu combino alternativamente com [[:space:]]
  • o XI corresponde a "tudo menos espaço" [^[:space:]]

Esses dois não funcionarão:

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

a[^\s]b      instead use a[^[:space:]]b
Torge
fonte
1
A partir do sed 4.4, aparentemente ainda é verdade que você deve usar em ([^[:space:]])vez de ([^\s]). Estou no openSUSE Tumbleweed 2018 04 03.
user2394284