Entender o que é uma express?o regular em 30 minutos e ter uma compreens?o básica para que você possa usá-la em seus programas ou páginas da web.
Tutorial de Introdu??o ao Regex em 30 Minutos Objetivo do artigo Como usar este tutorial O que é exatamente uma express?o regular? Introdu??o Teste de express?o regular metacaractere Escape de caracteres Repetir classe de caracteres Condi??es de ramifica??o Grupo ant?nimo cita??o retroativa Zero-width assertion afirma??o negativa de largura zero Comentário Ganancia e pregui?a Op??es de tratamento Grupo balanceado / correspondência recursiva O que mais n?o foi mencionado? Entrar em contato com o autor Recursos online e referências bibliográficas deste artigo.
N?o se deixe intimidar pelas express?es complexas abaixo; basta seguir meu passo a passo e você descobrirá que as express?es regulares n?o s?o t?o difíceis quanto você imagina. Claro, se depois de ler este tutorial você perceber que entendeu muito, mas quase n?o se lembra de nada, isso é normal - eu acredito que a probabilidade de alguém que nunca teve contato com express?es regulares lembrar mais de 80% da sintaxe mencionada após ler este tutorial é praticamente zero. Aqui, o objetivo é apenas fazer você entender os princípios básicos; no futuro, você precisará praticar mais e usar frequentemente para dominar as express?es regulares.
O mais importante é - por favor, me dê. 30 minutos Se você n?o tem experiência com express?es regulares, n?o tente em 30. segundo Porta interna - a menos que você seja o Superman :)
Além de servir como um tutorial introdutório, este artigo também tenta ser um manual de referência de sintaxe de express?es regulares que pode ser usado no dia a dia. Com base na experiência do autor, esse objetivo foi alcan?ado de forma satisfatória — veja, eu mesmo n?o consegui lembrar de tudo, n?o é?
Limpar formata??o Conven??es de formato de texto: termos técnicos Metacaracteres/formato de sintaxe express?o regular Uma parte da express?o regular (usada para análise) String de origem para correspondência. Explica??o sobre express?es regulares ou uma de suas partes. 。
Notas de rodapé ocultas à direita deste texto, há algumas notas que servem principalmente para fornecer informa??es relevantes ou explicar conceitos básicos para leitores sem forma??o em programa??o, e geralmente podem ser ignoradas.
Ao desenvolver programas ou páginas da web que manipulam strings, frequentemente é necessário buscar strings que atendam a certas regras complexas. express?o regular é uma ferramenta utilizada para descrever essas regras. Em outras palavras, express?es regulares s?o códigos que registram regras de texto.
é muito provável que você tenha usado o comando de busca de arquivos no Windows/Dos.
curinga
wildcard
)
ou seja
*
e
?
Se você quiser encontrar todos os documentos do Word em um diretório específico, você deve procurar.
*
.doc
Aqui,
*
pode ser interpretado como qualquer string. Semelhante aos caracteres curinga, as express?es regulares também s?o uma ferramenta para correspondência de texto, mas, em compara??o com os caracteres curinga, elas podem descrever suas necessidades de forma mais precisa - é claro, o custo é que s?o mais complexas - por exemplo, você pode escrever uma express?o regular para encontrar
Todas as strings que come?am com 0, seguidas por 2 a 3 dígitos, depois um hífen "-" e, por fim, 7 ou 8 dígitos.
(como)
010-12345678
ou
0376-7654321
)。
caractere é a unidade mais básica no processamento de texto por software de computador, podendo ser uma letra, um número, um sinal de pontua??o, um espa?o, uma quebra de linha, um caractere chinês, entre outros. string é uma sequência de 0 ou mais caracteres. Texto Ou seja, texto, string. Dizer uma determinada string. Combinar Uma express?o regular geralmente se refere a uma parte (ou várias partes) de uma string que pode satisfazer as condi??es impostas pela express?o.
A melhor maneira de aprender express?es regulares é come?ar com exemplos, entender os exemplos e, em seguida, modificar e experimentar por conta própria. Abaixo est?o vários exemplos simples, acompanhados de explica??es detalhadas.
Suponha que você esteja procurando em um romance em inglês. hi Você pode usar express?es regulares. hi 。
Este é quase o regex mais simples, que pode corresponder exatamente a strings como: Formado por dois caracteres, o primeiro é h e o segundo é i. Normalmente, as ferramentas que lidam com express?es regulares oferecem uma op??o de ignorar maiúsculas e minúsculas. Se essa op??o estiver selecionada, ela pode corresponder. hi , HI , Hi , hI Qualquer uma das quatro situa??es.
Infelizmente, muitas palavras contêm hi esses dois caracteres consecutivos, como him , history , high Espera. Usar. hi Para procurar, aqui dentro. hi Também será encontrado. Se precisar. Encontre com precis?o a palavra "hi". Deveríamos usar. \bhi\b 。
\b
é um código especial definido pela express?o regular (ok, algumas pessoas chamam isso de).
caractere especial,
metacharacter
representa
O início ou o fim da palavra, ou seja, o ponto de divis?o da palavra.
Embora normalmente as palavras em inglês sejam separadas por espa?os, pontua??o ou quebras de linha, no entanto,
\b
n?o corresponde a nenhum dos caracteres separadores dessas palavras, ele
Apenas corresponder a uma posi??o.
。
Se o que você está procurando é Logo atrás do hi, há uma Lucy. você deveria usar \bhi\b.*\bLucy\b 。
Se precisar de uma express?o mais precisa, \b Combine essa posi??o: o caractere anterior e o caractere posterior n?o s?o todos (um é, um n?o é ou n?o existe). \w 。
Aqui, o ponto (.) é outro metacaractere que corresponde. Qualquer caractere, exceto o caractere de nova linha. . *S?o também metacaracteres, mas o que representam n?o é um caractere, nem uma posi??o, mas sim uma quantidade - eles especificam. * O conteúdo anterior pode ser repetido continuamente quantas vezes forem necessárias para que toda a express?o seja correspondida. Portanto, * Juntos significa uma quantidade arbitrária de caracteres que n?o contêm quebras de linha. Agora. \bhi\b. * \bLucy\b O significado é bem claro: hi Lucy 。
Se usarmos outros metacaracteres ao mesmo tempo, podemos construir express?es regulares mais poderosas. Por exemplo, o seguinte exemplo:
0\d\d-\d\d\d\d\d\d\d\d Combinar uma string assim: Come?ando com 0, seguido por dois dígitos, ent?o um hífen "-", e finalmente 8 dígitos. (ou seja, os números de telefone da China. Claro, este exemplo só pode corresponder a casos com código de área de 3 dígitos).
換行符就是'\n',ASCII編碼為10(十六進(jìn)制
0x0A
) de caracteres.
aqui \d é um novo metacaractere, que corresponde. Um dígito (0, ou 1, ou 2, ou...) )- N?o é um metacaractere, apenas corresponde a ele mesmo - o hífen (ou tra?o, ou linha média, ou como você preferir chamá-lo).
Para evitar tantas repeti??es irritantes, também podemos escrever essa express?o assim: 0\d{2}-\d{8} Aqui. \d 后面的{ 2 }({ 8 }) significa "anterior" ou "antes". \d Deve haver uma correspondência contínua repetida 2 vezes (8 vezes). 。
Se você n?o acha que express?es regulares s?o difíceis de ler e escrever, ou você é um gênio, ou você n?o é deste planeta. A sintaxe das express?es regulares é muito complicada, mesmo para aqueles que as usam com frequência. Devido à dificuldade de leitura e escrita e à propens?o a erros, é muito necessário encontrar uma ferramenta para testar express?es regulares.
Outras ferramentas de teste disponíveis:
As diferen?as nos detalhes das express?es regulares em diferentes ambientes s?o significativas. Este tutorial aborda o comportamento das express?es regulares no Microsoft .Net Framework 4.0, portanto, recomendo a ferramenta que desenvolvi para .Net. Testador de express?es regulares Por favor, consulte as instru??es nesta página para instalar e executar o software.
Abaixo está uma captura de tela do funcionamento do Regex Tester:
Agora você já conhece alguns caracteres especiais muito úteis, como \b , . , * , e também \d Na express?o regular, há mais caracteres especiais, como \s Combinar Qualquer caractere em branco, incluindo espa?os, tabula??es (Tab), quebras de linha, espa?os em branco de largura total em chinês, etc. 。 \w Combinar letras, números, sublinhados ou caracteres chineses, etc. 。
Vamos ver mais exemplos a seguir:
\ba\w * \b Correspondência com letras a Palavra inicial - Come?a com uma determinada palavra. \b ), e depois as letras a , seguido de uma quantidade arbitrária de letras ou números ( \w * ), por fim, no final da palavra ( \b )。
O tratamento especial para caracteres chineses/漢字 é suportado pelo mecanismo de express?es regulares fornecido pelo .Net; para informa??es específicas em outros ambientes, consulte a documenta??o relevante.
Certo, agora vamos falar sobre o que significa uma palavra em express?es regulares: é uma sequência contínua de pelo menos um \w. De fato, isso n?o tem muito a ver com as milhares de coisas com o mesmo nome que precisamos decorar ao aprender inglês :)
\d+ Combinar 1 ou mais dígitos contínuos Aqui. + é e * Caracteres especiais semelhantes, a diferen?a é que * Correspondência repetida qualquer número de vezes (possivelmente 0 vezes), enquanto + ent?o corresponde Repetir uma vez ou mais. 。
\b\w{6}\b Combinar palavra com exatamente 6 caracteres 。
Código | Explica??o |
---|---|
. | Correspondência de qualquer caractere, exceto a quebra de linha. |
\w | Corresponder letras, números, sublinhados ou caracteres chineses. |
\s | Corresponder a qualquer caractere em branco |
\d | Correspondência de números |
\b | Combinar o início ou o fim da palavra. |
^ | Correspondência do início da string |
$ | Correspondência do final da string |
metacaractere ^ & $ Todos correspondem a uma posi??o, isso e \b é um pouco semelhante. ^ Correspondência com o início da string que você deseja procurar, $ Correspondência de final. Esses dois códigos s?o muito úteis para validar o conteúdo de entrada, por exemplo, se um site exigir que o número QQ que você preenche deve ter entre 5 e 12 dígitos, você pode usar: ^\d{5,12}$ 。
Aqui está { 5,12 } e { mencionados anteriormente 2 } é semelhante, apenas { 2 } correspondência Só pode repetir duas vezes, nem mais nem menos. ,{ 5,12 } ent?o é O número de repeti??es n?o pode ser inferior a 5 vezes nem superior a 12 vezes. Caso contrário, n?o corresponderá.
Os mecanismos de express?es regulares geralmente oferecem um método para "testar se uma string específica corresponde a uma express?o regular", como no JavaScript.
RegExp.test()
Método ou método Regex.IsMatch() no .NET. Aqui, a correspondência refere-se a se há alguma parte da string que corresponde à regra da express?o. Se n?o usar ^ e $ A respeito de \d{5,12} Nesse sentido, usar esse método só garante que a string contém números consecutivos de 5 a 12 e n?o apenas uma string inteira de 5 a 12 dígitos.
Porque foi utilizado ^ e $ Portanto, toda a string de entrada deve ser usada para e \d{5,12} Para combinar, ou seja, toda a entrada deve ser 5 a 12 números Portanto, se o número QQ inserido corresponder a essa express?o regular, ent?o estará em conformidade com os requisitos.
Assim como a op??o de ignorar maiúsculas e minúsculas, algumas ferramentas de processamento de express?es regulares também possuem uma op??o para tratar múltiplas linhas. Se essa op??o estiver selecionada, ^ e $ o significado se tornou Combinar o início e o fim da linha. 。
Se você quiser encontrar os metacaracteres em si, como por exemplo ., ou *, surgem problemas: você n?o pode especificá-los, pois eles ser?o interpretados de outra forma. Nesse caso, você deve usar \ para cancelar o significado especial desses caracteres. Portanto, você deve usar . e \ * Claro, para procurar \ você mesmo, você também precisa usar. \ \ .
Por exemplo:
unibetter
\
.com
Combinar
unibetter.com
,
>C:
\
Windows
Combinar
C:\Windows
。
Você já viu o anterior. * , + , {2} , {2,5} Esses s?o os modos de correspondência repetida. Abaixo est?o todos os quantificadores na express?o regular (códigos de quantidade específica, como *, {5,12}, etc.):
Código/Sintaxe | Explica??o |
---|---|
* | Repetir zero ou mais vezes. |
+ | Repita uma vez ou mais. |
? | Repetir zero ou uma vez. |
{n} | repetir n vezes |
{n,} | Repetir n vezes ou mais. |
{m,m} | Repetir de n a m vezes. |
Aqui est?o alguns exemplos de uso repetido:
Windows\d+ Combinar Windows seguido de um ou mais números
^\w+ Combinar A primeira palavra da linha (ou a primeira palavra da string inteira, dependendo da configura??o da op??o).
Para procurar números, letras ou espa?os em branco é muito simples, pois já existem correspondências para esses caracteres. * * o caractere especial, mas se você quiser combinar caracteres que n?o s?o caracteres especiais predefinidos * * (Como as vogais a, e, i, o, u), o que deve ser feito?
[muito simples, você só precisa listar eles entre colchetes, como] [aeiou] Apenas combinar. qualquer vogal em inglês , [.?!] Combinar Pontua??o (. ou ? ou !) 。
Também podemos especificar um caractere facilmente. escopo como [0-9] O significado de representante e \d é exatamente igual. Um número Da mesma forma. [a-z0-9A-Z_] também é totalmente equivalente a \w (Se considerar apenas o inglês).
Aqui está uma express?o mais complexa: \ (?0\d{2}[) -]?\d{8} 。
Essa express?o pode corresponder. Vários formatos de números de telefone como (010)88886666 ou 022-22334455 ou 02912345678 Espere. Vamos fazer uma análise disso: primeiro, é um caractere de escape. \ (, pode aparecer 0 ou 1 vez ( ? ), depois é um 0 , seguido por 2 números ( \d{2} ), depois é ) ou - ou espa?o um deles, aparece uma vez ou n?o aparece ( ? ), por fim s?o 8 dígitos ( \d{8} )。
“(” e “)” também s?o caracteres especiais, o que vem a seguir Grupo de Festas Ent?o, será mencionado aqui, por isso é necessário usar. Escape 。
Infelizmente, a express?o anterior também pode corresponder. 010)12345678 ou (022-87654321 esse formato "incorreto". Para resolver esse problema, precisamos usar Condi??es de ramifica??o . no regex Condi??es de ramifica??o Refere-se a várias regras, se qualquer uma das regras for atendida, deve ser considerada como uma correspondência. O método específico é usar | para separar as diferentes regras. N?o entendeu? Sem problemas, veja o exemplo:
0\d{2}-\d{8}|0\d{3}-\d{7} Essa express?o pode. Correspondência de dois tipos de números de telefone separados por hífen: um é o código de área de três dígitos e o número local de oito dígitos (por exemplo, 010-12345678), e o outro é o código de área de quatro dígitos e o número local de sete dígitos (0376-2233445). 。
\ (0\d{2} ) [- ]?\d{8}|0\d{2}[- ]?\d{8} Essa express?o Correspondência de números de telefone com código de área de 3 dígitos, onde o código de área pode estar entre parênteses ou n?o, e pode ser separado do número local por um hífen, um espa?o ou pode n?o ter separa??o. Você pode tentar expandir essa express?o usando condi??es ramificadas para também suportar códigos de área de 4 dígitos.
\ d{5}-\d{4}|\d{5} Esta express?o é usada para corresponder ao código postal dos Estados Unidos. A regra para os códigos postais americanos é que eles consistem em 5 dígitos ou 9 dígitos separados por um hífen. A raz?o para dar este exemplo é que ele ilustra um problema: Ao usar condi??es ramificadas, é importante prestar aten??o à ordem dos diferentes critérios. Se você mudar para \ d{5}|\d{5}-\d{4} Nesse caso, ele só corresponderá a códigos postais de 5 dígitos (e aos 5 primeiros dígitos de códigos postais de 9 dígitos). A raz?o é que, ao testar as condi??es de ramifica??o, cada condi??o será verificada da esquerda para a direita, e se uma ramifica??o for atendida, as outras condi??es n?o ser?o mais consideradas.
Já mencionamos como repetir um único caractere (basta adicionar um quantificador logo após o caractere); mas e se quisermos repetir múltiplos caracteres? Você pode usar parênteses para especificar. sub-express?o (também chamado de Grupo ), ent?o você pode especificar o número de repeti??es dessa subexpress?o, e também pode realizar outras opera??es na subexpress?o (que ser?o apresentadas mais adiante).
(\d{1,3}
.
){3}\d{1,3}
é simples.
IP
Correspondência de endere?os
Express?o. Para entender esta express?o, analise-a na seguinte ordem:
\d{1,3}
Correspondência de números de 1 a 3 dígitos.
,
(\d{1,3}
\
.){3}
Combinar
três dígitos mais um ponto final.
Grupo
) Repita 3 vezes
, por fim adicione.
Um número de um a três dígitos.
\
d{1,3}
)
。
Infelizmente, isso também irá coincidir.
256.300.888.999
Esse endere?o IP que n?o pode existir. Se pudéssemos usar compara??es aritméticas, talvez pudéssemos resolver esse problema de forma simples, mas express?es regulares n?o oferecem nenhuma funcionalidade matemática, ent?o só podemos usar agrupamentos longos, op??es e classes de caracteres para descrever um correto.
IP
Endere?o:
((2[0-4]\d|25[0-5]|[01]?\d\d?)
\
.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
。
Os números em um endere?o IP n?o podem ser maiores que 255, n?o se deixem enganar pelos roteiristas da terceira temporada de "24"...
A chave para entender esta express?o é compreender. 2[0-4]\d|25[0-5]|[01]?\d\d? Aqui eu n?o vou entrar em detalhes, você mesmo deve ser capaz de analisar seu significado.
às vezes, é necessário procurar caracteres que n?o pertencem a uma classe de caracteres que pode ser facilmente definida. Por exemplo, quando se deseja encontrar qualquer caractere, exceto números, é necessário usar ant?nimo :
Código/Sintaxe | Explica??o |
---|---|
\W | Correspondência de qualquer caractere que n?o seja letra, número, sublinhado ou caractere chinês. |
\S | Corresponde a qualquer caractere que n?o seja um espa?o em branco. |
\D | Corresponder a qualquer caractere que n?o seja um dígito. |
\B | Correspondência n?o é a posi??o do início ou do fim da palavra. |
[^x] | Combinar qualquer caractere exceto x. |
[^aeiou] | Correspondência de qualquer caractere que n?o seja uma das letras a, e, i, o, u. |
Exemplo: \S+ Correspondência de strings que n?o contêm espa?os em branco.
<a[^> ] +> Combine strings that start with "a" and are enclosed in angle brackets.
usando parênteses para especificar uma subexpress?o, Correspondência do texto deste subexpress?o. (O conteúdo capturado por este grupo) pode ser processado ainda mais em express?es ou outros programas. Por padr?o, cada grupo terá automaticamente um Número do grupo A regra é: da esquerda para a direita, usando o parêntese esquerdo do grupo como sinal, o primeiro grupo que aparece tem o número 1, o segundo tem o número 2, e assim por diante.
cita??o retroativa Usado para pesquisar novamente o texto correspondente a um grupo anterior. Por exemplo, \1 representante Texto correspondente ao Grupo 1 Difícil de entender? Veja o exemplo:
\b(\w+)\b\s+\1\b Pode ser usado para combinar palavras repetidas, como go go ou kitty kitty Esta express?o é primeiro uma palavra ou seja Mais de uma letra ou número entre o início e o fim da palavra. (\b(\w+)\b) Essa palavra será capturada no grupo número 1, e depois é 1 ou vários espa?os em branco ( \s+ ), finalmente é Conteúdo capturado no grupo 1 (ou seja, a palavra correspondente anterior) \1 ) 。
Hum... na verdade, a aloca??o dos números do grupo n?o é t?o simples quanto eu acabei de dizer:
- O grupo 0 corresponde a toda a express?o regular.
- Na verdade, o processo de aloca??o de números de grupo deve ser realizado em duas passagens da esquerda para a direita: a primeira passagem aloca números apenas para os grupos n?o nomeados, enquanto a segunda passagem aloca números apenas para os grupos nomeados – portanto, todos os números dos grupos nomeados s?o maiores do que os números dos grupos n?o nomeados.
- Você pode usar a sintaxe (?:exp) para privar um grupo do direito à atribui??o de um número de grupo.
Você também pode especificar subexpress?es por conta própria. Nome do grupo Para especificar um nome de grupo para uma subexpress?o, use a seguinte sintaxe: ( ? < Word>\w+ )(或者把尖括號換成'也行:( ?'Word'\w+ ), assim se torna \w+ O nome do grupo foi designado como Word Para referenciar esse grupo de forma inversa. Captura do conteúdo, você pode usar \k < Word> , ent?o o exemplo anterior também pode ser escrito assim: \b(? < Word>\w+)\b\s+\k < Word>\b 。
Ao usar parênteses, há muitas regras gramaticais com finalidades específicas. Abaixo est?o listados alguns dos mais comuns:
xxxxxxxxxx
分類(lèi) 代碼/語(yǔ)法 Explica??o
-----------------------------------------------------------------------------------------
(exp) 匹配exp,并捕獲文本到自動(dòng)命名的組里
捕獲 ? ? (?<name>exp) ? 匹配exp,并捕獲文本到名稱(chēng)為name的組里,也可以寫(xiě)成(?'name'exp)
? ? ? (?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號
-----------------------------------------------------------------------------------------
(?=exp) ? ? ? ? ? 匹配exp前面的位置
Zero-width assertion ? ? ? (?<=exp) ? ? ? ? 匹配exp后面的位置
? ? ? ? ? ? ? ? (?!exp) 匹配后面跟的不是exp的位置
? ? ? ? ? ? ? ? (?<!exp) 匹配前面不是exp的位置
-----------------------------------------------------------------------------------------
Comentário (?#comment) ? 這種類(lèi)型的分組不對正則表達式的處理產(chǎn)生任何影響,用于提供注釋
Já discutimos as duas primeiras gramáticas. A terceira ( ?:exp ) N?o mudará a forma como as express?es regulares s?o tratadas, apenas o conteúdo correspondente a esse tipo de grupo n?o será capturado em um grupo como nas duas primeiras formas, e n?o terá um número de grupo. "Por que eu gostaria de fazer isso?" — Boa pergunta, o que você acha?
Os próximos quatro s?o usados para encontrar coisas antes ou depois de certos conteúdos (mas n?o incluindo esses conteúdos), ou seja, eles s?o como \b , ^ , $ assim usado para especificar uma posi??o, que deve atender a certas condi??es (ou seja, afirma??es), por isso também s?o chamados de Zero-width assertion é melhor usar exemplos para ilustrar.
(?=exp)
também chamado
Predicado antecipado de previs?o de largura zero.
ele/ela
Afirmar que a posi??o após a própria ocorrência pode corresponder à express?o exp.
Por exemplo.
\b\w+(?=ing\b)
, combinar com
ing
parte anterior da palavra final (exceto
ing
parte externa)
como procurar
I'm
singing while you're
dancing.
ele vai corresponder
sing
e
danc
。
(?<=exp)
também chamado
Afirmativa de falha após revis?o positiva de largura zero.
ele/ela
Afirmar que a posi??o anterior à própria ocorrência pode corresponder à express?o exp.
Por exemplo (
?<=\bre)\w+\b
vai corresponder a
palavras que come?am com "re" e a parte posterior (exceto "re")
por exemplo, ao procurar
reading
a book
Quando ele corresponde
ading
。
Terrestres, vocês n?o acham que esses termos s?o muito complicados e difíceis de lembrar? Eu também sinto o mesmo. Saber que existe algo assim já é suficiente, como se chama, tanto faz! Se uma pessoa n?o tiver nome, poderá se concentrar em praticar a espada; se um objeto n?o tiver nome, poderá ser escolhido livremente...
Uma asser??o é usada para declarar um fato que deve ser verdadeiro. Em express?es regulares, a correspondência só continuará se a asser??o for verdadeira.
Se você deseja adicionar uma vírgula a cada três dígitos em um número muito longo (claro, come?ando pela direita), você pode procurar as partes onde precisa adicionar vírgulas na frente e no meio. ((?<=\d)\d{3})+\b , use it against. 1234567890 O resultado da busca é 234567890 。
O exemplo abaixo utiliza ambas as afirma??es: (?<=\s)\d+(?=\s) Combinar Números separados por espa?os em branco (novamente enfatizando, n?o incluindo esses espa?os em branco) 。
Anteriormente, mencionamos como procurar. n?o é um determinado caractere ou n?o está em uma determinada classe de caracteres o método de caracteres (ant?nimo). Mas se apenas quisermos Assegurar que um determinado caractere n?o apare?a, mas sem querer fazer a correspondência. O que fazer ent?o? Por exemplo, se quisermos encontrar uma palavra assim - que contém a letra q, mas que n?o é seguida pela letra u, podemos tentar assim:
\b\w * q [ ^u ] \w * \b Combinar incluir A letra q que n?o é seguida pela letra u. a palavra No entanto, se você fizer mais testes (ou se sua mente for agu?ada o suficiente para perceber diretamente), você descobrirá que, se a letra q aparecer no final da palavra, como... Iraq , Benq essa express?o dará erro. Isso ocorre porque [^u] Sempre deve corresponder a um caractere, ent?o se q for o último caractere da palavra, o que vem a seguir [ ^u] A correspondência será feita com o delimitador da palavra que vem após "q" (pode ser um espa?o, um ponto ou outra coisa qualquer). \w * \b Ent?o, irá corresponder à próxima palavra. \b\w * q [ ^u]\w * \b Pode corresponder a todo. Iraq fighting 。 afirma??o negativa de largura zero Pode resolver esse tipo de problema, pois ele só corresponde a uma posi??o e n?o a outras. Consumo Qualquer caractere. Agora, podemos resolver esse problema da seguinte maneira: \b\w * q(?!u)\w * \b 。
Afirmativa antecipada negativa de largura zero.
(?!exp)
,
Afirmar que n?o é possível corresponder à express?o exp após esta posi??o.
Por exemplo:
\d{3}(?!\d)
Correspondem a três dígitos e isso
Um número de três dígitos n?o pode ser seguido por um número.
;
\b((?!abc)\w)+\b
Combinar
N?o contém strings contínuas.
abc
a palavra
。
Da mesma forma, podemos usar (?<!exp) , Afirmativa pós-revis?o negativa de largura zero. Venha. Afirmar que a posi??o anterior n?o pode corresponder à express?o exp. : (?<![a-z])\d{7} Combinar Sete dígitos que n?o come?am com letras minúsculas. 。
Um exemplo mais complexo: (?<=<(\w+)>). * (?=<\/\1>) Correspondência do conteúdo dentro de tags HTML simples que n?o contêm atributos. 。 (?<=<(\w+)>) Foi especificado assim. prefixo : Palavras entre colchetes angulares. (por exemplo, pode ser) < b>),然后是 .* (qualquer string), termina com um sufixo (?=<\/\1>) . Preste aten??o ao sufixo. \/ Isso utiliza a escape de caracteres mencionada anteriormente; \1 é uma cita??o reversa, referindo-se exatamente a Primeiro grupo capturado anterior (\w+) Conteúdo correspondente, assim se o prefixo for na verdade < b>的話(huà),后綴就是 < /b>了。整個(gè)表達式匹配的是 < b>和 < /b>之間的內容(再次提醒,不包括前綴和后綴本身)。
Por favor, analise detalhadamente a express?o. (?<=<(\w+)>). * (?=<\/\1>) Essa express?o representa melhor o verdadeiro propósito das asser??es de largura zero.
Outra utiliza??o dos parênteses é através da gramática. (?#comment) Por favor, inclua comentários. Por exemplo: 2[0-4]\d(?#200-249)|25 [ 0-5](?#250-255)|[01]?\d\d?(?#0-199) 。
Para incluir comentários, é melhor ativar a op??o "Ignorar espa?os em branco no modo de ignorar", assim você pode adicionar espa?os, tabula??es e quebras de linha livremente ao escrever express?es, e na utiliza??o real, tudo isso será ignorado. Ao ativar esta op??o, todo o texto após o # até o final da linha será considerado um comentário e ignorado. Por exemplo, podemos escrever uma express?o anterior assim:
(?<= | # Afirma??o do prefixo do texto a ser correspondido |
<(\w+)> | # Encontrar letras ou números entre sinais de menor e maior (ou seja, etiquetas HTML/XML) |
) | # Fim do prefixo |
.* | # Correspondência de qualquer texto |
(?= | # Afirma??o para corresponder ao sufixo do texto |
<\/\1> | # 查找尖括號括起來(lái)的內容:前面是一個(gè)"/",后面是先前捕獲的標簽 |
) | # Sufixo final |
Quando uma express?o regular contém quantificadores que aceitam repeti??es, o comportamento usual é (desde que permita que toda a express?o seja correspondida) fazer a correspondência.
O máximo possível.
de caracteres. Tomando esta express?o como exemplo:
a.
*
b
ele vai corresponder
A string mais longa que come?a com 'a' e termina com 'b'.
Se usado para pesquisar
aabab
Ele corresponderá à string inteira.
aabab
Isto é chamado de
ganancia
Combina??o.
às vezes, precisamos mais. pregui?a Correspondência, ou seja, correspondência. O mínimo possível. Os caracteres. Os quantificadores dados anteriormente podem ser convertidos para o modo de correspondência pregui?osa, basta adicionar um ponto de interroga??o após eles. ? Assim. .*? significa Corresponder a qualquer quantidade de repeti??es, mas utilizando o mínimo de repeti??es necessário para que a correspondência total seja bem-sucedida. Agora vamos ver um exemplo da vers?o pregui?osa:
a.
*
?b
Combinar
A menor string que come?a com 'a' e termina com 'b'.
Se for aplicado a
aabab
A frase irá corresponder.
aab
(primeiro ao terceiro caractere)
e
ab
。
Código/Sintaxe | Explica??o |
---|---|
*? | Repita quantas vezes quiser, mas tente repetir o mínimo possível. |
+? | Repita uma ou mais vezes, mas evite repeti??es desnecessárias. |
?? | Repita 0 ou 1 vez, mas repita o mínimo possível. |
{n,m}? | Repita de n a m vezes, mas com o mínimo de repeti??es possível. |
{n,}? | Repita n vezes ou mais, mas tente repetir o mínimo possível. |
Por que a primeira correspondência é aab (do primeiro ao terceiro caractere) e n?o ab (do segundo ao terceiro caractere)? De forma simples, porque a express?o regular tem outra regra cuja prioridade é mais alta do que a regra pregui?osa/gananciosa: a correspondência que come?a primeiro tem a maior prioridade — A correspondência que come?a mais cedo vence.
Acima foram apresentados algumas op??es, como ignorar maiúsculas e minúsculas, tratar múltiplas linhas, etc. Essas op??es podem ser usadas para alterar a forma como as express?es regulares s?o processadas. Abaixo est?o as op??es de express?es regulares mais comuns no .Net:
Nome | Explica??o |
---|---|
IgnoreCase
(ignorar maiúsculas e minúsculas)
|
A correspondência n?o diferencia maiúsculas de minúsculas. |
Multiline
(modo de várias linhas)
|
Alterar ^ e $ o significado, fazendo com que correspondam no início e no final de qualquer linha, e n?o apenas no início e no final da string inteira. (Neste modo, $ O significado preciso é: combinar a posi??o anterior e a posi??o antes do final da string. |
Singleline
(Modo de linha única)
|
Mude o significado do ponto (.) para que corresponda a cada caractere (incluindo a nova linha \n). |
IgnorePatternWhitespace
(ignorar espa?os em branco)
|
Ignorar espa?os em branco n?o escapados na express?o e ativar por # Anota??es marcadas |
ExplicitCapture
(Captura explícita)
|
Apenas capture grupos que foram explicitamente nomeados. |
Uma pergunta que é frequentemente feita é: só é possível usar um modo de várias linhas ou um modo de uma linha ao mesmo tempo? A resposta é: n?o. N?o há rela??o entre essas duas op??es, exceto que seus nomes s?o semelhantes (a ponto de causar confus?o).
Em C#, você pode usar Construtor Regex(String, RegexOptions) 來(lái)設置正則表達式的處理選項。如:Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);
às vezes, precisamos combinar como ( 100 * ( 50 + 15 ) ) Uma estrutura hierárquica aninhada como esta, pode ser utilizada de forma simples. \ (.+ \ ) Isso só corresponderá ao conteúdo entre o parêntese esquerdo mais à esquerda e o parêntese direito mais à direita (aqui estamos discutindo o modo ganancioso, o modo pregui?oso também tem os problemas abaixo). Suponha que o número de parênteses esquerdos e direitos na string original n?o seja igual, por exemplo, ( 5 / ( 3 + 2 ) ) ) Ent?o, o número de elementos de ambos os lados em nossos resultados de correspondência n?o será igual. Existe alguma maneira de encontrar o conteúdo entre os parênteses correspondentes mais longos em uma string assim?
A gramática de grupos de equilíbrio apresentada aqui é suportada pelo .Net Framework; outras linguagens/bibliotecas podem n?o oferecer esse recurso, ou podem suportá-lo, mas exigem o uso de uma sintaxe diferente.
Para evitar ( e \ ( Vamos confundir completamente sua mente, e vamos usar colchetes angulares em vez de parênteses. Agora nossa pergunta se torna como colocar xx aa> yy Como capturar o conteúdo dentro dos pares de colchetes angulares mais longos em uma string assim?
Aqui, é necessário usar a seguinte constru??o gramatical:
(?'group') Nomeie o conteúdo capturado como grupo e empurre-o. Pilha
(?'-group') Desempilhe o conteúdo capturado chamado "group", que foi o último a ser inserido na pilha. Se a pilha estava vazia, a correspondência deste grupo falha.
(?(group)yes|no) Se houver um conteúdo capturado chamado "group" na pilha, continue correspondendo à parte "yes" da express?o; caso contrário, continue correspondendo à parte "no".
(?!) A afirma??o antecipada negativa de largura zero falha sempre ao tentar fazer uma correspondência, pois n?o há express?o sufixa.
我們需要做的是每碰到了左括號,就在壓入一個(gè)"Open",每碰到一個(gè)右括號,就彈出一個(gè),到了最后就看看堆棧是否為空--如果不為空那就證明左括號比右括號多,那匹配就應該失敗。正則表達式引擎會(huì )進(jìn)行回溯(放棄最前面或最后面的一些字符),盡量使整個(gè)表達式得到匹配。
如果你不是一個(gè)程序員(或者你自稱(chēng)程序員但是不知道堆棧是什么東西),你就這樣理解上面的三種語(yǔ)法吧:第一個(gè)就是在黑板上寫(xiě)一個(gè)"group",第二個(gè)就是從黑板上擦掉一個(gè)"group",第三個(gè)就是看黑板上寫(xiě)的還有沒(méi)有"group",如果有就繼續匹配yes部分,否則就匹配no部分。
xxxxxxxxxx
< ? ? ? ? ? ? ? ? ? ? ? ? #o parêntese esquerdo mais externo
[^<>]* ? ? ? ? ? ? ? ?#O conteúdo após o parêntese esquerdo mais externo que n?o é um parêntese.
(
(
(?'Open'<) ? ?#Encontrou um parêntese esquerdo, escreva "Open" no quadro.
[^<>]* ? ? ? ?#Correspondência do conteúdo que n?o é um parêntese após o parêntese esquerdo
)+
? ? (
? ? (?'-Open'>) ? ?#Encontrou um parêntese direito, apague um "Open"
? ? ? [^<>]* ? ? ? ?#Correspondência de conteúdo após o parêntese direito que n?o é um parêntese.
)+
? ? )*
? ? ? ? (?(Open)(?!)) ? #Antes de encontrar o parêntese direito mais externo, verifique se ainda há "Open" n?o apagado no quadro; se houver, a correspondência falhou.
?
? ? ? ? ? > ? ? ? ? ? ? ?#parêntese direito mais externo
Uma das aplica??es mais comuns de grupos balanceados é a correspondência de HTML. O exemplo abaixo pode corresponder a aninhamentos. < div>標簽: <div [ ^>] * > [ ^<>]*(((?'Open'] * >) [ ^<>] * )+((?'-Open') [ ^<>] * )+) * (?(Open)(?!)) < /div>
Já foram descritos muitos elementos para construir express?es regulares, mas ainda há muitos que n?o foram mencionados. Abaixo está uma lista de alguns elementos n?o mencionados, incluindo a sintaxe e uma breve explica??o. Você pode encontrar referências mais detalhadas na internet para aprendê-los - quando precisar usá-los. Se você instalou a Biblioteca MSDN, também pode encontrar a documenta??o detalhada sobre express?es regulares no .NET lá.
Código/Sintaxe | Explica??o |
---|---|
\a | caractere de alarme (imprimir isso faz o computador emitir um beep) |
\b | Normalmente é a posi??o de separa??o das palavras, mas se for usado dentro de uma classe de caracteres, representa um retrocesso. |
\t | Tabula??o |
\r | Enter |
\v | Tabula??o vertical |
\f | quebra de página |
\n | quebra de linha |
\e | Escape |
\0nn | O caractere cujo código octal é nn na tabela ASCII. |
\xnn | O caractere com código hexadecimal nn na tabela ASCII. |
\unnnn | O caractere com o código hexadecimal nnnn no código Unicode. |
\cN | Caracteres de controle ASCII. Por exemplo, \cC representa Ctrl+C. |
\A | Início da string (semelhante a ^, mas n?o afetado pela op??o de múltiplas linhas) |
\Z | Fim da string ou fim da linha (n?o afetado pela op??o de processamento de várias linhas) |
\z | Fim da string (semelhante a $, mas n?o afetado pela op??o de várias linhas) |
\G | Início da pesquisa atual |
\p{name} | Classe de caracteres nomeada como name no Unicode, por exemplo, \p{IsGreek} |
(?>exp) | express?o gananciosa |
(? < x> - < y>exp) | Grupo de equilíbrio |
(?im-nsx:exp) | Alterar op??es de processamento na subexpress?o exp. |
(?im-nsx) | Alterar as op??es de processamento para a parte que vem após a express?o. |
(?(exp)yes|no) | Trate exp como uma afirma??o positiva de largura zero. Se puder haver uma correspondência nessa posi??o, use yes como a express?o deste grupo; caso contrário, use no. |
(?(exp)yes) | Da mesma forma, apenas use express?es vazias como n?o. |
(?(name)yes|no) | Se o grupo nomeado como name capturou conteúdo, use yes como express?o; caso contrário, use no. |
(?(name)yes) | Da mesma forma, apenas use express?es vazias como n?o. |
好吧,我承認,我騙了你,讀到這里你肯定花了不止30分鐘.相信我,這是我的錯,而不是因為你太笨.我之所以說(shuō)"30分鐘",是為了讓你有信心,有耐心繼續下去.既然你看到了這里,那證明我的陰謀成功了.被忽悠的感覺(jué)很爽吧?
Se você deseja fazer uma reclama??o sobre mim, ou acha que eu poderia enganar de forma mais habilidosa, ou tem qualquer outra quest?o, sinta-se à vontade para vir. Meu blog Deixe-me saber.
Você usou recentemente: