Precisa testar para uma "\\" (barra invertida) neste Reg Ex

votos
0

Atualmente eu uso este reg ex:

\bI([ ]{1,2})([a-zA-Z]|\d){2,13}\b

Foi apenas trazido à minha atenção que o texto que eu uso isso contra poderia conter uma \ (barra invertida). Como faço para adicionar isso para a expressão?

Publicado 10/12/2008 em 01:23
fonte usuário
Em outras línguas...                            


4 respostas

votos
2

Adicionar |\\dentro do grupo, depois a \dpor exemplo.

Respondeu 10/12/2008 em 01:26
fonte usuário

votos
1

Esta expressão pode ser simplificada se você também está permitindo que o caractere sublinhado no segundo registo de captura, e que está disposto a usar metacaracteres. Isso muda o seguinte:

([a-zA-Z]|\d){2,13}

nisso ...

([\w]{2,13})

e você também pode adicionar um teste para a barra invertida com este ...

([\w\x5c]{2,13})

o que torna a regex apenas um pouco mais fácil de globo ocular, dependendo da sua preferência pessoal.

"\bI([\x20]{1,2})([\w\x5c]{2,13})\b"

Veja também:

Respondeu 10/12/2008 em 01:36
fonte usuário

votos
0

Como assinalei no meu comentário ao post de Slavy, \\-> \bcomo uma barra invertida não é um caractere de palavra. Assim, a minha sugestão é

/\bI([ ]{1,2})([\p{IsAlnum}\\]{2,13})(?:[^\w\\]|$)/ 

Eu assumi que você queria capturar todo o 2-13 caracteres, e não apenas o primeiro que se aplica, então eu ajustei meu RE.

Você pode fazer a última captura de uma visão antecipada se o motor suporta-lo e você não quer consumir. Isso seria algo como:

/\bI([ ]{1,2})([\p{IsAlnum}\\]{2,13})(?=[^\w\\]|$)/ 
Respondeu 10/12/2008 em 05:44
fonte usuário

votos
0

Ambos @ slavy13 e @dreftymac dar-lhe a solução básica com ponteiros, mas ...

  • Você pode usar \ddentro de uma classe de personagem para significar um dígito.
  • Você não precisa colocar em branco em uma classe de personagem para combiná-la (exceto, talvez, para maior clareza, no entanto, que é discutível).
  • Você pode usar [:alpha:]dentro de uma classe de personagem para significar um caractere alfabético, [:digit:]para significar um dígito, e [:alnum:]para significar um alfanumérico (especificamente, não incluindo o sublinhado, ao contrário \w). Note-se que estas classes de personagens pode significar mais caracteres que você espera; pensar de caracteres acentuados e dígitos não-árabe, especialmente em Unicode.
  • Se você quer capturar toda a informação após o espaço, é necessário a repetição dentro dos parênteses de captura.

Contrastar o comportamento desses dois one-liners:

perl -n -e 'print "$2\n" if m/\bI( {1,2})([a-zA-Z\d\\]){2,13}\b/'

perl -n -e 'print "$2\n" if m/\bI( {1,2})([a-zA-Z\d\\]{2,13})\b/'

Dada a linha de entrada " I a123", as primeiras cópias "3" e a segunda impressões "A123". Obviamente, se tudo que você queria era o último caractere da segunda parte da cadeia de caracteres, então a expressão original é bom. No entanto, isso é improvável que seja a exigência. (Obviamente, se você está apenas interessado em todo o lote, em seguida, usando ' $&' dá-lhe o texto correspondente, mas tem implicações de eficiência negativos.)

Eu provavelmente usar esse regex como parece mais clara para mim:

m/\bI( {1,2})([[:alnum:]\\]{2,13})\b/

Tempo para o plug obrigatória: ler "de Jeff Friedl Dominando Expressões Regulares ".

Respondeu 10/12/2008 em 02:37
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more