Expressão regular

Regular

Metacaracteres

Metacaracteres:.^$+?{}[]|()\

.   通配符(除\n的任何字符)
\d  数字
\s  空白字符
\w  字母或数字或下划线或汉字
\b  特殊字符边界(匹配单词边界,不匹配任何字符。要防止转义字符串前面加r)
^   开始
$   结束

Personagem escapando

\ Usado para escapar da correspondência de metacaracteres correspondente \ Precisa usar \

Classe de personagem

Intervalo de caracteres

[] 从字符集里匹配一个 可以使用a-z a,z表示范围 [.?!] 匹配标点符号(.或?或!)

Exemplos:

[\u4E00-\u9FA5] 匹配汉字

Correspondência duplicada


*   0~无穷(可以按照0*True,结果为0)尽可能多的匹配
+   1~无穷(可以按照0+True,结果为True)
?   出现0~1次(取最少)非贪婪匹配

{n,m}   n-m次
{n,}    多于n次
{0,}==*        {0,1}==?   {1,}==+

Exemplo:
Regularização do número de celular:

^1[3|5|8]\d{9}$

Ganância e preguiça

Quando a expressão regular contém qualificadores que podem aceitar repetição, o comportamento usual é (na premissa de que toda a expressão pode ser correspondida) para corresponder ao maior número possível de caracteres. Tome esta expressão como exemplo: a. * B, ela corresponderá à string mais longa começando com a e terminando com b. Se você usá-lo para procurar o aabab, ele corresponderá a toda a string aabab. Isso é chamado de correspondência gananciosa.

Às vezes, precisamos de uma correspondência lenta, ou seja, da correspondência do menor número possível de caracteres. Os qualificadores dados acima podem ser convertidos no modo de correspondência lenta, desde que sejam seguidos por um ponto de interrogação? Isso .*?significa combinar qualquer número de repetições, mas usar o menor número de repetições com a premissa de tornar a partida inteira bem-sucedida. Agora, veja o exemplo da versão lenta: A * b corresponde à string mais curta que começa com a e termina com b. Se você aplicá-lo ao abab, ele corresponderá aab (primeiro ao terceiro caracteres) e ab (quarto ao quinto caracteres).

Por que a primeira correspondência é aab (primeiro ao terceiro caractere) em vez de b (segundo ao terceiro caractere)? Simplificando, como as expressões regulares têm outra regra, elas têm uma prioridade mais alta que as regras preguiçosas / gananciosas: a partida que começa primeiro tem a maior prioridade - a partida que começa mais cedo vence.

Correspondência gananciosa padrão (correspondente de trás para frente)

Não ganancioso (da frente para trás) adicionado após a ganância?

| Condição da filial (ou correspondência)

\d{5}-\d{4}|\d{5}Esta expressão é usada para corresponder aos códigos postais dos EUA. As regras de CEP dos EUA têm 5 dígitos ou 9 dígitos separados por hífens. A razão pela qual este exemplo é dado é porque pode ilustrar um problema: ao usar condições de ramificação, preste atenção à ordem de cada condição. Se você alterar para \d{5}|\d{5}-\d{4}, ele corresponderá apenas ao código postal (e aos 5 primeiros dos 9 códigos postais). O motivo é que, ao corresponder às condições da ramificação, cada condição será testada da esquerda para a direita.Se uma determinada ramificação for atendida, nenhuma outra condição será ignorada.

() Grupo

(\d{1,3}.){3}\d{1,3}É uma expressão simples de correspondência de endereço. Para entender essa expressão, analise-a na seguinte ordem: \d{1,3}combine 1 a 3 dígitos, (\d{1,3}.){3}combine 3 dígitos mais um período em inglês, o conjunto é o grupo) repita 3 vezes e, finalmente, adicione um a três dígitos Número de(\d{1,3})

Após especificar uma subexpressão usando parênteses, o texto que corresponde à subexpressão (ou seja, o conteúdo capturado por esse grupo) pode ser processado posteriormente na expressão ou em outros programas. Por padrão, cada grupo terá automaticamente um número de grupo, a regra é: da esquerda para a direita, com o parêntese esquerdo do grupo como sinal, o número do grupo do primeiro grupo aparece como 1 e o segundo grupo como 2. Por analogia.

Infelizmente, ele também corresponderá ao endereço | P impossível de 256.300888999. Se você puder usar a comparação aritmética, poderá resolver esse problema de maneira simples, mas as expressões regulares não fornecem nenhuma função sobre matemática, portanto, você pode usar apenas agrupamentos longos, seleção e classes de caracteres para descrever um endereço | P correto:(2[0-4]\d|25[0-5]|[01]?\d\d?\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

var s='JavaScript and Java'
var p=/\bJava(\w+)\b/
p.exec(s)[0]    //结果为:"JavaScript"
p.exec(s)[1]    //结果为:"Script"

Anti-sentido

Às vezes, você precisa encontrar caracteres que não pertencem a uma classe de caracteres que pode ser simplesmente definida. Por exemplo, se você deseja encontrar qualquer caractere diferente de números, é necessário usar o antisense.

Códigos antisense comuns:

Código / Sintaxe Explicação
\W Caracteres chineses sublinhados não alfanuméricos
\ S Caracteres sem espaço em branco
\ D Caracteres não numéricos
\ B Início ou fim sem palavra
[^ x] Qualquer caractere que não seja x
[^ aeiou] Qualquer personagem que não seja aeiou

Exemplos:

\S+ 匹配不包含空白字符的字符串
<a[^>]+>    匹配尖括号包起来的a开头的字符串

Partidas que não recebem:

\w(?=pattern)  正向肯定匹配
(?<=pattern)\w  逆向肯定匹配
\w(?!pattern)  正向否定匹配
(?!pattern)\w  反向否定匹配

Voltar referência

\b(\w+)\b\s+\1\b  \ 1 indica que o conteúdo do primeiro grupo é usado para corresponder a palavras adjacentes repetidas: vá vá

Você também pode especificar o nome do grupo da subexpressão. Para especificar o nome do grupo de uma subexpressão, use esta sintaxe: (?<Word>\w+)Ou substitua os colchetes angulares por ': (?' Word '\ w +), para que o nome do grupo de \ w + seja especificado como Word. Para reverter essa captura de pacotes de referência, você pode usar \k<Word>, de modo que o exemplo anterior também pode ser escrita assim: (?<Word>\w+)\b\s+\k<Word>\b.

Ainda existem muitos usos de parênteses práticos: liste os comumente usados:

Classificação Código / Sintaxe Explicação
Captura (exp) Combine exp e capture texto em grupos nomeados automaticamente
Captura (?<name>exp) Combinar exp e capturar o texto no grupo chamado name também pode ser escrito como(?'name'exp)
Captura (?:exp) Corresponda exp, não captura texto, não atribui grupos
Asserção de largura zero (?=exp) Corresponder à posição na frente de exp
Asserção de largura zero (?<=exp) Corresponder à posição após exp
Asserção de largura zero (?!exp) Corresponde a posições que não são seguidas por exp
Asserção de largura zero (?<!exp) Combine posições fora da frente da exp
Comente (?#comment) Esse agrupamento não afeta as expressões regulares, fornecendo comentários para leitura humana

Asserção de largura zero

Os próximos quatro são usados ​​para encontrar coisas antes ou depois de determinados conteúdos (mas não os incluindo), ou seja, são usados ​​para especificar uma posição como b, ^, $, e essa posição deve atender a certas condições Ou seja, asserções), então elas também são chamadas de asserções de largura zero . É melhor ilustrá-lo com um exemplo:

As asserções são usadas para declarar um fato que deve ser verdadeiro. A expressão regular só continuará a corresponder se a asserção for verdadeira.

(?=exp)Também conhecida como asserção de precedência de predição positiva com largura zero , afirma que a posição em que aparece pode corresponder à expressão exp. Por exemplo \b\w+(?=ing\b), combinando a parte da frente de uma palavra que termina em ing (que não seja ing), como quando procuro que estou cantando enquanto você dança, ela combina com canto e dança.

(?<=exp)Também chamada de revisão positiva de largura zero após a afirmação , ela afirma que a posição na frente de sua ocorrência pode corresponder à expressão exp.

Por exemplo, ele (?<=\bre)\w+\bcorresponderá à segunda metade das palavras que começam com re, exceto re) .Por exemplo, ao procurar um livro, ele corresponde à leitura.Se você deseja adicionar uma vírgula entre cada três dígitos em um número longo (é claro É adicionada da direita), você pode encontrar a parte que precisa adicionar vírgulas na frente e dentro da seguinte maneira :, ((?<=\d)\d{3})+\bquando você a usa para procurar 1234567890, o resultado é 234567890.

O exemplo a seguir usa essas duas afirmações: (?<=\s)\d+(?=\s)números correspondentes separados por espaços em branco são enfatizados novamente, excluindo esses espaços em branco)

Asserção reversa de largura zero

\b\w*q[^u]\w*\bCombine as palavras que contêm a letra q que não é a letra u . Mas se você fizer mais testes (ou se for suficientemente perspicaz para observar diretamente), verá que se q aparecer no final da palavra, como Iraque, Benq, essa expressão estará errada. Isso ocorre porque [^u]sempre um caractere para corresponder; portanto, se q é o último caractere de uma palavra, o seguinte [^u]corresponderá ao separador de palavras após q (pode ser um espaço, um ponto ou algo assim) e o seguinte \w*\bcorresponderá A próxima palavra, para que \b\w*q[^u]\w*\bpossa corresponder a toda a luta no Iraque. Uma asserção de largura zero na direção negativa pode resolver esse problema porque corresponde apenas a uma posição e não consome nenhum caractere. Agora, o que podemos fazer para resolver este problema: \b\w*q(?!u)\w*\b.

A previsão negativa de largura zero afirma primeiro (?! Exp) que a expressão exp não pode ser correspondida após esta posição. Por exemplo: \d{3}(?!\d)corresponda a três dígitos e esses três dígitos não podem ser seguidos por dígitos; \b((?!abc)\w)+\bcorresponda a palavras que não contêm a sequência consecutiva abc.

Da mesma forma, podemos usar (? <! Exp), uma revisão negativa de largura zero e emitir uma asserção para afirmar que a frente desta posição não pode corresponder à expressão para exp:(?<![a-z])\d{7}corresponder aos sete dígitos à frente dos quais não são letras minúsculas.

Por favor, analise a expressão em detalhes (?<=<(\W+)>).*(?=<\/\1>), essa expressão pode mostrar melhor o uso real de asserções de largura zero.

Um exemplo mais complicado: (?<=<(\W+)>).*(?=<\/\1>)correspondência de conteúdo dentro de tags HTML simples que não contêm atributos. (?<=<(w+)>)Esse prefixo é especificado : palavras entre colchetes angulares (que podem ser, por exemplo ), então. * (Qualquer sequência) e, finalmente, um sufixo (? = </ \ 1>). Observe o / no sufixo, que usa o caractere de escape mencionado anteriormente; \ é uma referência anterior, que se refere ao primeiro grupo capturado e o anterior (W +) corresponde, de modo que, se o prefixo for realmente em seguida, o sufixo é a. Toda a expressão é compensada e o conteúdo entre (Mais uma vez, não inclui o prefixo e de sufixo si)

Outro uso de parênteses é incluir comentários através da sintaxe (? #Comment). Por 2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)exemplo: .

Testador de expressão regular

Acho que você gosta

Origin www.cnblogs.com/Neroi/p/12716876.html
Recomendado
Clasificación