Partilhar via


Expressões regulares (C++)

A biblioteca padrão C++ dá suporte a várias gramáticas de expressões regulares. Este tópico discute as variações gramaticais disponíveis ao usar expressões regulares.

Gramática da expressão regular

A gramática de expressão regular a ser usada é especificada pelo uso de um dos valores de enumeração std::regex_constants::syntax_option_type. Essas gramáticas de expressão regular são definidas em std::regex_constants:

  • ECMAScript: isso é mais próximo da gramática usada pelos idiomas do JavaScript e .NET.
  • basic: as expressões regulares POSIX basic ou BRE.
  • extended: as expressões regulares POSIX extended ou ERE.
  • awk: isto é extended, mas ele tem mais escapes para caracteres que não são impressos.
  • grep: isto é basic, mas também permite que caracteres de nova linha (\n) separem alternâncias.
  • egrep: isto é extended, mas também permite que caracteres de nova linha separem alternâncias.

Por padrão, se nenhuma gramática for especificada, ECMAScript será usada. Apenas uma gramática pode ser especificada.

Vários sinalizadores também podem ser aplicados:

  • icase: ignora maiúsculas e minúsculas quando houver correspondência.
  • nosubs: ignora correspondências marcadas (ou seja, expressões entre parênteses). Não há substituições armazenadas.
  • optimize: torne a correspondência mais rápida, às custas de mais tempo de construção.
  • collate: use sequências de ordenação sensíveis à localidade (por exemplo, intervalos do formulário [a-z]).

Zero ou mais sinalizadores podem ser combinados com a gramática para especificar o comportamento do mecanismo de expressão regular. Se apenas sinalizadores forem especificados, ECMAScript será assumido como a gramática.

Element

Um elemento pode ser um dos seguintes:

  • Um caractere comum que corresponde ao mesmo caractere na sequência de destino.

  • Um caractere '.' curinga que corresponde a qualquer caractere na sequência de destino, exceto uma nova linha.

  • Uma expressão entre colchetes do formulário [expr], que corresponde a um caractere ou a um elemento de ordenação na sequência de destino que também está no conjunto definido pela expressão expr ou do formulário [^expr], que corresponde a um caractere ou a um elemento de ordenação na sequência de destino que não está no conjunto definido pela expressão expr.

    A expressão expr pode conter qualquer combinação dos seguintes itens:

    • Um caractere individual. Adiciona o caractere ao conjunto definido por expr.

    • Um intervalo de caracteres da forma ch1-ch2. Adiciona os caracteres que são representados pelos valores no intervalo fechado [ch1, ch2] ao conjunto definido por expr.

    • Uma classe de caracteres da forma [:name:]. Adiciona os caracteres na classe nomeada ao conjunto definido por expr.

    • Uma classe de equivalência da forma [=elt=]. Adiciona os elementos de agrupamento que são equivalentes a elt ao conjunto definido por expr.

    • Um símbolo de ordenação da forma [.elt.]. Adiciona o elemento de ordenação elt ao conjunto definido por expr.

  • Uma âncora. Uma âncora ^ corresponde ao início da sequência de destino. A âncora $ corresponde ao final da sequência de destino.

Um grupo de captura da forma (subexpressão) ou \(subexpressão\) em basic e grep, em que corresponde à sequência de caracteres na sequência de destino que é correspondida pelo padrão entre os delimitadores.

  • Um caractere de escape de identidade do forma \k, que corresponde ao caractere k na sequência de destino.

Exemplos:

  • a corresponde à sequência de destino"a", mas não corresponde à sequência de destino "B", "b" ou "c".

  • . corresponde a todas as sequências de destino "a", "B", "b" e "c".

  • [b-z] corresponde às sequências de destino "b" e "c", mas não corresponde às sequências de destino "a"ou "B".

  • [:lower:] corresponde às sequências de destino"a", "b" e "c", mas não corresponde à sequência de destino "B".

  • (a) corresponde à sequência de destino "a" e associa o grupo de captura 1 à subsequência "a", mas não corresponde às sequências de destino "B", "b" ou "c".

Em ECMAScript, basic e grep, um elemento também pode ser uma referência inversa da forma"\dd, em que dd representa um valor decimal N que corresponde a uma sequência de caracteres na sequência de destino que é igual à sequência de caracteres que é correspondida pelo enésimo grupo de captura.

Por exemplo, (a)\1 corresponde à sequência de destino "aa" porque o primeiro (e único) grupo de captura corresponde à sequência inicial "a" e \1 corresponde à sequência final "a".

Em ECMAScript, um elemento também pode ser um dos seguintes itens:

  • Um grupo não captura da forma (?: subexpressão). Corresponde à sequência de caracteres na sequência de destino que é correspondida pelo padrão entre os delimitadores.

  • Um escape de formatação de arquivo da forma \f, \n, \r, \t ou \v. Isso corresponde a um avanço de página, uma nova linha, um retorno de carro, uma guia horizontal e uma guia vertical, respectivamente, na sequência de destino.

  • Uma asserção positiva da forma (= subexpressão). Corresponde à sequência de caracteres na sequência de destino que é correspondida pelo padrão entre os delimitadores, mas não altera a posição de correspondência na sequência de destino.

  • Uma asserção negativa da forma (! subexpressão). Corresponde a qualquer sequência de caracteres na sequência de destino que não corresponde ao padrão entre os delimitadores e não altera a posição de correspondência na sequência de destino.

  • Uma sequência de escape hexadecimal da forma \xhh. Corresponde a um caractere na sequência de destino que é representado pelos dois dígitos hexadecimais hh.

  • Uma sequência de escape unicode da forma \uhhhh. Corresponde a um caractere na sequência de destino que é representado pelos quatro dígitos hexadecimais hhhh.

  • Uma sequência de escape de controle da forma\ck. Corresponde ao caractere de controle que é nomeado pelo caractere k.

  • Uma asserção do limite de palavra da forma \b. Corresponde quando a posição atual na sequência de destino está logo após um limite de palavra.

  • Uma asserção do limite de palavra negativa da forma \B. Corresponde quando a posição atual na sequência de destino está logo após um limite de palavra.

  • Um escape de caractere dsw da forma \d, \D, \s, \S, \w e \W. Fornece um nome curto para uma classe de caractere.

Exemplos:

  • (?:a) corresponde à sequência de destino "a", mas "(?:a)\1" é inválido porque não há grupo de captura 1.

  • (=a)a corresponde à sequência de destino "a". A asserção positiva corresponde à sequência inicial "a" na sequência de destino e "a" final na expressão regular corresponde à sequência inicial "a" na sequência de destino.

  • (!a)a não corresponde à sequência de destino "a".

  • a\b. corresponde à sequência de destino"a~", mas não corresponde à sequência de destino "ab".

  • a\B. corresponde à sequência de destino"ab", mas não corresponde à sequência de destino "a~".

Em awk, um elemento também pode ser um dos seguintes itens:

  • Um escape de formatação de arquivo da forma \\, \a, \b, \f, \n, \r, \t ou \v. Isso corresponde a uma barra invertida, um alerta, um backspace, um avanço de página, uma nova linha, um retorno de carro, uma guia horizontal e uma guia vertical, respectivamente, na sequência de destino.

  • Uma sequência de escape octal da forma \ooo. Corresponde a um caractere na sequência de destino cuja representação é o valor representado por um, dois ou três dígitos octais ooo.

Repetição

Qualquer elemento diferente de uma asserção positiva, uma asserção negativa ou uma âncora pode ser seguido por uma contagem de repetição. O tipo mais genérico da contagem de repetição usa a forma {min, max} ou \{min, max} em basic e grep. Um elemento que é seguido por essa forma de contagem de repetição corresponde a pelo menos ocorrências sucessivas de min e a não mais do que ocorrências sucessivas de max de uma sequência que corresponde ao elemento.

Por exemplo, a{2,3} corresponde à sequência de destino "aa" e à sequência de destino "aaa", mas não à sequência de destino "a" ou à sequência de destino "aaaa".

Uma contagem de repetição também pode usar uma das seguintes formas:

  • {min} ou \{min} em basic e grep. Equivalente a {min, min}.

  • {min,} ou \{min,\} em basic e grep. Equivalente a {min, não associado}.

  • * é equivalente à {0,não associado}.

Exemplos:

  • a{2} corresponde à sequência de destino "aa", mas não à sequência de destino "a" ou à sequência de destino"aaa".

  • a{2,} corresponde à sequência de destino "aa", à sequência de destino "aaa", e assim por diante, mas não à sequência de destino "a".

  • a* corresponde à sequência de destino "", à sequência de destino "a", à sequência de destino "aa" e assim por diante.

Para todas as gramáticas, exceto basic e grep, uma contagem de repetição também pode usar uma das seguintes formas:

  • ? é equivalente a {0,1}.

  • + é equivalente à {1,não associado}.

Exemplos:

  • a? corresponde à sequência de destino "" e à sequência de destino "a", mas não à sequência de destino"aa".

  • a+ corresponde à sequência de destino "a", à sequência de destino "aa", e assim por diante, mas não à sequência de destino "".

Em ECMAScript, todas as formas de contagem de repetição podem ser seguidas pelo caractere ?, que designa uma repetição não Greedy.

Concatenação

Os elementos de expressão regular, com ou sem contagens de repetição, podem ser concatenados para formar expressões regulares mais longas. A expressão resultante corresponde a uma sequência de destino que é uma concatenação das sequências que são correspondidas pelos elementos individuais.

Por exemplo, a{2,3}b corresponde à sequência de destino "aab" e à sequência de destino "aaab", mas não corresponde à sequência de destino "ab" ou à sequência de destino "aaaab".

Alternação

Em todas as gramáticas de expressão regular, exceto basic e grep, uma expressão regular concatenada pode ser seguida pelo caractere | (pipe) e outra expressão regular concatenada. Qualquer número de expressões regulares concatenadas pode ser combinado dessa forma. A expressão resultante corresponde a qualquer sequência de destino que corresponda a uma ou mais das expressões regulares concatenadas.

Quando mais de uma expressão regular concatenada corresponde à sequência de destino, ECMAScript escolhe a primeira das expressões regulares concatenadas que corresponde à sequência como a correspondência, que será referida como primeira correspondência. As outras gramáticas de expressão regular escolhem aquela que obtém a correspondência mais longa.

Por exemplo, ab|cd corresponde à sequência de destino "ab" e à sequência de destino "cd", mas não corresponde à sequência de destino "abd" ou à sequência de destino "acd".

Em grep e egrep, um caractere de nova linha (\n) pode ser usado para separar alternâncias.

Subexpressão

Em basic e grep, uma subexpressão é uma concatenação. Em outras gramáticas de expressão regular, uma subexpressão é uma alternância.

Resumo de gramática

A tabela a seguir resume os recursos que estão disponíveis nas várias gramáticas de expressão regular:

Element basic extended ECMAScript grep egrep awk
alternância usando | + + + +
alternância usando \n + +
âncora + + + + + +
referência inversa + + +
expressão entre colchetes + + + + + +
grupo de captura usando () + + + +
grupo de captura usando \(\) + +
sequência de escape de controle +
escape de caractere dsw +
escape de formato de arquivo + +
sequência de escape hexadecimal +
escape de identidade + + + + + +
declaração negativa +
declaração de limite de palavra negativa +
grupo de não captura +
repetição não greedy +
sequência de escape octal +
caractere comum + + + + + +
declaração positiva +
repetição usando {} + + + +
repetição usando \{\} + +
repetição usando * + + + + + +
repetição usando ? e + + + + +
sequência de escape unicode +
caractere curinga + + + + + +
declaração de limite de palavra +

Detalhes da semântica

Âncora

Uma âncora corresponde a uma posição na cadeia de caracteres de destino, e não a um caractere. Uma ^ corresponde ao início da cadeia de caracteres de destino e um $ corresponde ao fim da cadeia de caracteres de destino.

Referência inversa

Uma referência inversa é uma barra invertida seguida por um valor N decimal. Ele corresponde ao conteúdo do enésimo grupo de captura. O valor de N não deve ser maior que o número de grupos de captura que precede a referência inversa. Em basic e grep, o valor de N é determinado pelo dígito decimal que segue a barra invertida. Em ECMAScript, o valor de N é determinado por todos os dígitos decimais que seguem imediatamente a barra invertida. Portanto, em basic e grep, o valor de N nunca é superior a 9, mesmo que a expressão regular tenha mais de nove grupos de captura. Em ECMAScript, o valor de N é unbounded.

Exemplos:

  • ((a+)(b+))(c+)\3 corresponde à sequência de destino "aabbbcbbb". A referência inversa \3 corresponde ao texto no terceiro grupo de captura, isto é, "(b+)". Não corresponde à sequência de destino "aabbbcbb".

  • (a)\2 não é válido.

  • (b(((((((((a))))))))))\10 tem significados diferentes basic e em ECMAScript. Em basic a referência inversa é \1. A referência inversa corresponde ao conteúdo do primeiro grupo de captura (isto é, aquele que começa com (b e termina com ) e vem antes da referência inversa), e o final 0 corresponde ao caractere comum 0. Em ECMAScript a referência inversa é \10. Corresponde ao décimo grupo de captura, isto é, o mais interno.

Expressão entre colchetes

Uma expressão entre colchetes define um conjunto de caracteres e os elementos de agrupamento. Quando a expressão entre colchetes começar com o caractere ^, a correspondência será bem-sucedida se nenhum elemento no conjunto corresponder ao caractere atual na sequência de destino. Caso contrário, a correspondência será bem-sucedida se algum dos elementos no conjunto corresponder ao caractere atual na sequência de destino.

O conjunto de caracteres pode ser definido listando qualquer combinação de caracteres individuais, intervalos de caracteres, classes de caracteres, classes de equivalência e símbolos de agrupamento.

Grupo de captura

O grupo de captura marca seu conteúdo como uma unidade única na gramática da expressão regular e rotula o texto de destino que corresponde ao seu conteúdo. O rótulo que é associado a cada grupo de captura é um número, que é determinado pela contagem dos parênteses de abertura que marcam grupos de captura até, e inclusive, os parênteses de abertura que marcam o grupo de captura atual. Nessa implementação, o número máximo de grupos de captura é 31.

Exemplos:

  • ab+ corresponde à sequência de destino"abb", mas não corresponde à sequência de destino "abab".

  • (ab)+ não corresponde à sequência de destino "abb", mas corresponde à sequência de destino "abab".

  • ((a+)(b+))(c+) corresponde à sequência de destino "aabbbc" e associa o grupo de captura 1 à subsequência "aabbb", o grupo de captura 2 à subsequência "aa", o grupo de captura 3 a "bbb" e o grupo de captura 4 à subsequência "c".

Classe de caractere

Uma classe de caractere em uma expressão entre colchetes adiciona todos os caracteres na classe nomeada ao conjunto de caracteres que é definido pela expressão entre colchetes. Para criar uma classe de caractere, use [: seguido pelo nome da classe seguida por :].

Internamente, nomes de classes de caractere são reconhecidos chamando id = traits.lookup_classname. Um caractere ch pertencerá a uma classe dessa se traits.isctype(ch, id) retornar true. O modelo regex_traits padrão oferece suporte a nomes de classe na tabela a seguir.

Nome da Classe Descrição
alnum letras minúsculas, letras maiúsculas e dígitos
alpha letras minúsculas e letras maiúsculas
blank espaço ou tabulação
cntrl os caracteres de escape de formatação de arquivo
digit dígitos
graph letras minúsculas, letras maiúsculas, dígitos e pontuação
lower letras minúsculas
print letras minúsculas, letras maiúsculas, dígitos, pontuação e espaço
punct pontuação
space space
upper caracteres maiúsculos
xdigit dígitos, a, b, c, d, e, f, A, B, C, D, E, F
d mesmo que digit
s mesmo que space
w mesmo que alnum

Intervalo de caracteres

Um intervalo de caracteres em uma expressão entre colchetes adiciona todos os caracteres no intervalo ao conjunto de caracteres que é definido pela expressão entre colchetes. Para criar um intervalo de caracteres, coloque o caractere '-' entre o primeiro e o último caracteres no intervalo. Um intervalo de caracteres coloca todos os caracteres que tem um valor numérico maior ou igual ao valor numérico do primeiro caractere e menor ou igual ao valor numérico do último caractere no conjunto. Observe que esse conjunto de caracteres adicionados depende da representação de caracteres específica da plataforma. Se o caractere '-' ocorrer no início ou no fim de uma expressão entre colchetes, ou como o primeiro ou o último caractere de um intervalo de caracteres, ele representa a si mesmo.

Exemplos:

  • [0-7] representa o conjunto de caracteres { 0, 1, 2, 3, 4, 5, 6, 7 }. Ele corresponde às sequências de destino "0", "1", e assim por diante, mas não a "a".

  • Em sistemas que usam a codificação de caractere ASCII, [h-k] representa o conjunto de caracteres { h, i, j, k }. Ele corresponde às sequências de destino "h", "i", e assim por diante, mas não "\x8A" ou "0".

  • Em sistemas que usam a codificação de caracteres EBCDIC, [h-k] representa o conjunto de caracteres { h, i, '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F', '\x90', j, k } (h é codificado como 0x88 e k é codificado como 0x92). Ele corresponde às sequências de destino "h", "i", "\x8A" e assim por diante, mas não a "0".

  • [-0-24] representa o conjunto de caracteres { -, 0, 1, 2, 4 }.

  • [0-2-] representa o conjunto de caracteres { 0, 1, 2, - }.

  • Em sistemas que usam codificação de caracteres ASCII, [+--] representa o conjunto de caracteres { + , - }.

No entanto, quando os intervalos que diferenciam a localidade são usados, os caracteres em um intervalo são determinados pelas regras de ordenação da localidade. Os caracteres que são agrupados após o primeiro caractere na definição do intervalo e antes do último caractere na definição do intervalo estão no conjunto. Os dois caracteres finais também estão no conjunto.

Elemento de agrupamento

Um elemento de agrupamento é uma sequência de vários caracteres que é tratada como um único caractere.

Símbolo de agrupamento

Um símbolo de agrupamento em uma expressão entre colchetes adiciona um elemento de agrupamento ao conjunto que é definido pela expressão entre colchetes. Para criar um símbolo de agrupamento, use [. seguido pelo elemento de agrupamento seguido por .]

Sequência de escape de controle

Uma sequência de escape de controle é uma barra invertida seguida pela letra 'c', seguida por uma das letras de 'a' a 'z' ou de 'A' a 'Z'. Ela corresponde ao caractere de controle ASCII que é nomeado por essa letra. Por exemplo, "\ci" corresponde à sequência de destino "\x09", pois Ctrl+I tem o valor 0x09.

Escape de caractere dsw

Um escape de caractere dsw é um nome curto para uma classe de caractere, conforme mostrado na tabela a seguir.

Sequência de escape Classe nomeada equivalente Classe nomeada padrão
\d [[:d:]] [[:digit:]]
\D [^[:d:]] [^[:digit:]]
\s [[:s:]] [[:space:]]
\S [^[:s:]] [^[:space:]]
\w [[:w:]] [a-zA-Z0-9_]*
\W [^[:w:]] [^a-zA-Z0-9_]*

*Conjunto de caracteres ASCII

Classe de equivalência

Uma classe de equivalência em uma expressão entre colchetes adiciona todos os caracteres e elementos de agrupamento que são equivalentes ao elemento de agrupamento na definição de classe de equivalência ao conjunto que é definido pela expressão entre colchetes.

Para criar uma classe de equivalência, use [= seguida por um elemento de agrupamento seguido por =]. Internamente, dois elementos de agrupamento, elt1 e elt2, serão equivalentes se traits.transform_primary(elt1.begin(), elt1.end()) == traits.transform_primary(elt2.begin(), elt2.end()).

Escape de formato de arquivo

Um escape de formato de arquivo consiste nas sequências de escape de caracteres de linguagem C usuais \\, \a, \b, \f, \n, \r, \t, \v. Tem os significados normais, que são, barra invertida, alerta, um backspace, um avanço de página, uma nova linha, um retorno de carro, uma guia horizontal e uma guia vertical, respectivamente. Em ECMAScript, \a e \b são proibidos. (\\ é permitido, mas é um caractere de escape de identidade, não um escape de formatação de arquivo).

Sequência de escape hexadecimal

Uma sequência de escape hexadecimal é uma barra invertida seguida pela letra x seguida por dois dígitos hexadecimais (0-9a-fA-F). Ela corresponde a um caractere na sequência de destino que tem o valor especificado pelos dois dígitos.

Por exemplo, "\x41" corresponde à sequência de destino "a" quando a codificação de caractere ASCII é usada.

Escape de identidade

Um escape de identidade é uma barra invertida seguida por um único caractere. Ele corresponde a esse caractere. É necessário quando o caractere tem um significado especial. O uso do escape de identidade remove o significado especial. Por exemplo:

  • a* corresponde à sequência de destino"aaa", mas não corresponde à sequência de destino "a*".

  • a\* não corresponde à sequência de destino "aaa", mas corresponde à sequência de destino "a*".

O conjunto de caracteres que são permitidos em um escape de identidade depende da gramática da expressão regular, conforme mostrado na tabela a seguir.

Gramática Caracteres de escape de identidade permitidos
basic, grep ( { ^ ) . $ } [ \ *{ }
extended, egrep ( { $ + ? ) [ | . \ * ^{ }
awk, extended mais { " / }
ECMAScript Todos os caracteres, exceto aqueles que podem fazer parte de um identificador. Geralmente, isso inclui letras, dígitos, $, _' e sequências de escape unicode. Para obter mais informações, consulte a Especificação da linguagem ECMAScript.

Caractere individual

Um caractere individual em uma expressão entre colchetes adiciona esse caractere ao conjunto de caracteres que é definido pela expressão entre colchetes. Em qualquer lugar em uma expressão entre colchetes, exceto no início, um ^ representa a si mesmo.

Exemplos:

  • [abc]corresponde às sequências de destino "a", "b" e "c", mas não à sequência "d".

  • [^abc] corresponde à sequência de destino "d", mas não às sequências de destino "a", "b" ou "c".

  • [a^bc] corresponde às sequências de destino "a", "b","c", e "^", mas não à sequência de destino "d".

Em todas as gramáticas de expressão regular, exceto ECMAScript, se um ] for o primeiro caractere que segue [ de abertura ou for o primeiro caractere que segue um ^ inicial, ele representa a si mesmo.

Exemplos:

  • []a é inválido porque não há ] para finalizar a expressão entre colchetes.

  • []abc] corresponde às sequências de destino "a", "b","c", e "]", mas não à sequência de destino "d".

  • [^]abc] corresponde à sequência de destino "d", mas não às sequências de destino "a", "b", "c" ou "]".

Em ECMAScript, use \] para representar o caractere ] em uma expressão entre colchetes.

Exemplos:

  • []a corresponde à sequência de destino "a" porque a expressão entre colchetes está vazia.

  • [\]abc] corresponde às sequências de destino "a", "b","c" e "]", mas não à sequência de destino "d".

Asserção negativa

Uma declaração negativa corresponde a qualquer item, menos a seu conteúdo. Não consome nenhum caractere na sequência de destino.

Por exemplo, (!aa)(a*) corresponde à sequência de destino "a" e associa o grupo de captura 1 à subsequência de "a". Não corresponde à sequência de destino"aa" ou à sequência de destino "aaa".

Asserção do limite de palavra negativa

Uma asserção do limite de palavra negativa corresponde se a posição atual na cadeia de caracteres de destino não vier logo após um limite de palavra.

Grupo de não captura

Um grupo de não captura marca seu conteúdo como uma unidade única na gramática de expressão regular, mas não rotula o texto de destino.

Por exemplo, (a)(?:b)*(c) corresponde ao texto de destino "abbc" e associa o grupo de captura 1 à subsequência "a" e o grupo de captura 2 à subsequência "c".

Repetição não greedy

Uma repetição não greedy consome a subsequência mais curta da sequência de destino que corresponde ao padrão. Uma repetição greedy consome a mais longa. Por exemplo, (a+)(a*b) corresponde à sequência de destino "aaab".

Quando uma repetição não greedy é usada, ela associa o grupo de captura 1 à subsequência "a" no início da sequência de destino e o grupo de captura 2 à subsequência "aab" no fim da sequência de destino.

Quando uma correspondência greedy é usada, ela associa o grupo de captura 1 à subsequência "aaa" e o grupo de captura 2 à subsequência "b".

Sequência de escape octal

Uma sequência de escape octal é uma barra invertida seguida por um, dois ou três dígitos octais (0-7). Ela corresponde a um caractere na sequência de destino que tem o valor especificado por esses dígitos. Se todos os dígitos forem 0, a sequência será inválida.

Por exemplo, \101 corresponde à sequência de destino "a" quando a codificação de caractere ASCII é usada.

Caractere comum

Um caractere comum é qualquer caractere válido que não tem um significado especial na gramática atual.

Em ECMAScript, os seguintes caracteres têm significados especiais:

  • ^ $ \ . * + ? ( ) [ ] { } |

Em basic e grep, os seguintes caracteres têm significados especiais:

  • . [ \

Além disso, em basic e grep, os seguintes caracteres têm significados especiais quando são usados em um determinado contexto:

  • * tem um significado especial em todos os casos, exceto quando ele for o primeiro caractere em uma expressão regular ou o primeiro caractere que segue um ^ inicial em uma expressão regular, ou quando for o primeiro caractere de um grupo de captura ou o primeiro caractere que segue um ^ inicial em um grupo de captura.

  • ^ tem um significado especial quando ele for o primeiro caractere de uma expressão regular.

  • $ tem um significado especial quando ele é o último caractere de uma expressão regular.

Em extended, egrep e awk, os seguintes caracteres têm significados especiais:

  • . [ \ ( * + ? { |

Além disso, em extended, egrep e awk, os seguintes caracteres têm significados especiais quando são usados em um determinado contexto.

  • ) tem um significado especial quando corresponde a um precedente (

  • ^ tem um significado especial quando ele for o primeiro caractere de uma expressão regular.

  • $ tem um significado especial quando ele é o último caractere de uma expressão regular.

Um caractere comum que corresponde ao mesmo caractere na sequência de destino. Por padrão, isso significa que a correspondência será bem-sucedida se dois caracteres forem representados pelo mesmo valor. Em uma correspondência que não diferencia letras maiúsculas e minúsculas, dois caracteres ch0 e ch1 corresponderão se traits.translate_nocase(ch0) == traits.translate_nocase(ch1). Em uma correspondência que diferencia a localidade, dois caracteres ch0 e ch1 corresponderão se traits.translate(ch0) == traits.translate(ch1).

Asserção positiva

Uma asserção positiva corresponde a seu conteúdo, mas não consome nenhum caractere na sequência de destino.

Exemplos:

  • (=aa)(a*) corresponde à sequência de destino "aaaa" e associa o grupo de captura 1 à subsequência "aaaa".

  • (aa)(a*) corresponde à sequência de destino "aaaa" e associa o grupo de captura 1 à subsequência "aa" no início da sequência de destino e o grupo de captura 2 à subsequência "aa" no fim da sequência de destino.

  • (=aa)(a)|(a) corresponde à sequência de destino "a" e associa o grupo de captura 1 a uma sequência vazia (pois houve falha na asserção positiva) e o grupo de captura 2 à subsequência "a". Ele também corresponde à sequência de destino "aa" e associa o grupo de captura 1 à subsequência "aa" e o grupo de captura 2 a uma sequência vazia.

Sequência de escape Unicode

Uma sequência de escape unicode é uma barra invertida seguida pela letra 'u' seguida por quatro dígitos hexadecimais (0-9a-fA-F). Ela corresponde a um caractere na sequência de destino que tem o valor especificado pelos quatro dígitos. Por exemplo, \u0041 corresponde à sequência de destino "a" quando a codificação de caractere ASCII é usada.

Caractere curinga

Um caractere curinga que corresponde a qualquer caractere na expressão de destino, exceto a uma nova linha.

Limite de palavra

Um limite de palavra ocorre nas seguintes situações:

  • O caractere atual está no início da sequência de destino e é um dos caracteres da palavra A-Za-z0-9_

  • A posição do caractere atual está após o fim da sequência de destino e o último caractere na sequência de destino é um dos caracteres da palavra.

  • O caractere atual é um dos caracteres de palavra e o caractere precedente, não.

  • O caractere atual não é um dos caracteres de palavra e o caractere precedente, sim.

Asserção do limite de palavra

Uma asserção do limite de palavra corresponderá quando a posição atual na cadeia de caracteres de destino vier logo após um limite de palavra.

Correspondência e pesquisa

Para que uma expressão regular corresponda a uma sequência de destino, a expressão regular inteira deverá corresponder à sequência de destino inteira. Por exemplo, a expressão regular bcd corresponde à sequência de destino "bcd", mas não corresponde à sequência de destino "abcd", nem à sequência de destino "bcde".

Para que uma pesquisa de expressão regular seja bem-sucedida, deve haver uma subsequência em algum lugar na sequência de destino que corresponda à expressão regular. Geralmente, a pesquisa encontra a subsequência correspondente à extrema esquerda.

Exemplos:

  • Uma pesquisa pela expressão regular bcd na sequência de destino "bcd" é bem-sucedida e corresponde à sequência inteira. A mesma pesquisa na sequência de destino "abcd" também é bem-sucedida e corresponde aos três últimos caracteres. A mesma pesquisa na sequência de destino "bcde" também é bem-sucedida e corresponde aos três primeiros caracteres.

  • Uma pesquisa pela expressão regular bcd na sequência de destino "bcdbcd" é bem-sucedida e corresponde aos três primeiros caracteres.

Se houver mais de uma subsequência que corresponda em algum local na sequência de destino, há duas maneiras de escolher o padrão correspondente.

A primeira correspondência escolhe a subsequência que foi encontrada primeiro quando a expressão regular é correspondida.

A correspondência mais longa escolhe a subsequência mais longa dentre aquelas com correspondência nesse local. Se houver mais de uma subsequência que tenha comprimento máximo, a correspondência mais longa escolherá aquela que foi encontrada primeiro.

Por exemplo, quando a primeira correspondência for usada, uma pesquisa pela expressão regular b|bc na sequência de destino "abcd" corresponde à subsequência "b", pois o termo da alternância do lado esquerdo corresponde a essa subsequência; portanto, a primeira correspondência não tenta o termo da alternância do lado direito. Quando a maior correspondência é usada, a mesma pesquisa corresponde a "bc" porque "bc" é mais longo que "b".

Uma correspondência parcial será bem-sucedida se a correspondência atingir o fim da sequência de destino sem falha, mesmo que ela não tenha atingido o fim da expressão regular. Dessa forma, depois do êxito de uma correspondência parcial, acrescentar caracteres à sequência de destino pode causar uma falha em uma correspondência parcial posterior. No entanto, após a falha de uma correspondência parcial, acrescentar caracteres à sequência de destino não fará com uma correspondência parcial posterior seja bem-sucedida. Por exemplo, com uma correspondência parcial, ab corresponde à sequência de destino "a", mas não à "ac".

Sinalizadores de formato

ECMAScript Regras de formato Regras de formato sed Texto de substituição
$& & A sequência de caracteres que corresponde à expressão regular inteira: [match[0].first, match[0].second)
$$ $
\& &
$`" (o sinal de dólar seguido pelo acento grave) A sequência de caracteres que precede a subsequência que corresponde à expressão regular: [match.prefix().first, match.prefix().second)
$'" (sinal de dólar seguido por aspas simples) A sequência de caracteres que segue a subsequência que corresponde à expressão regular: [match.suffix().first, match.suffix().second)
$n \n A sequência de caracteres que corresponde ao grupo de captura na posição n, em que n é um número entre 0 e 9: [match[n].first, match[n].second)
\\n \n
$nn A sequência de caracteres que corresponde ao grupo de captura na posição nn, em que nn é um número entre 10 e 99: [match[nn].first, match[nn].second)

Confira também

Visão geral da biblioteca padrão C++