21. Expressões Regulares

21.1 Visão geral

O JMeter inclui o software de correspondência de padrões Apache Jakarta ORO
Existe alguma documentação para isto no site de Jakarta, por exemplo um resumo dos caracteres de correspondência de padrões

Também há documentação sobre uma versão mais antiga do produto no guia do usuário do OROMatcher , que pode ser útil.

A correspondência de padrões é muito semelhante à correspondência de padrões em Perl. Uma instalação completa do Perl incluirá muita documentação sobre expressões regulares - procure por perlrequick , perlretut , perlre e perlreref .

Vale ressaltar a diferença entre " contém " e " corresponde ", conforme utilizado no elemento de teste Asserção de Resposta:

" contém "
significa que a expressão regular correspondeu a pelo menos alguma parte do destino, então ' alfabeto ' " contém " ' ph.b. ' porque a expressão regular corresponde à substring ' phabe '.
" partidas "
significa que a expressão regular correspondeu a todo o destino. Então ' alfabeto ' é " combinado " por ' al.*t '.

Nesse caso, é equivalente a envolver a expressão regular em ^ e $ , viz ' ^al.*t$ '.

No entanto, isso nem sempre é o caso. Por exemplo, a expressão regular ' alp|.lp.* ' está " contida " em ' alfabeto ', mas não " corresponde " a ' alfabeto '.

Por quê? Porque quando o pattern matcher encontra a sequência ' alp ' em ' alfabeto ', ele para de tentar qualquer outra combinação - e ' alp ' não é o mesmo que ' alfabeto ', pois não inclui ' habet '.

Ao contrário do Perl, não há necessidade de (ou seja, não) incluir a expressão regular em // .

Então, como se usa os modificadores ismx etc. se não houver / à direita ? A solução é usar expressões regulares estendidas , ou seja, /abc/i se torna (?i)abc . Veja também Colocação de modificadores abaixo.

21.2 Exemplos

Extrair uma única string

Suponha que você queira corresponder à seguinte parte de uma página da Web:
name="file" value="readme.txt">
e queira extrair readme.txt .
Uma expressão regular adequada seria:
name="file" value="(.+?)">

Os caracteres especiais acima são:

( e )
eles incluem a parte da string de correspondência a ser retornada
.
corresponder a qualquer caractere
+
uma ou mais vezes
?
não seja ganancioso, ou seja, pare quando a primeira partida for bem-sucedida

Nota: sem o ? , o .+ continuaria após o primeiro "> até encontrar o último "> possível - o que provavelmente não é o pretendido.

Nota: embora a expressão acima funcione, é mais eficiente usar a seguinte expressão:
name="file" value="([^"]+)"> onde
[^"] - significa corresponder a qualquer coisa, exceto "
Neste caso, o o mecanismo correspondente pode parar de procurar assim que vir o primeiro " , enquanto no caso anterior o mecanismo deve verificar se encontrou "> em vez de dizer " > .

Extraia várias strings

Suponha que você queira corresponder à seguinte parte de uma página da Web:
name="file.name" value="readme.txt" e queira extrair file.name e readme.txt .
Uma expressão regular adequada seria:
name="([^"]+)" value="([^"]+)"
Isso criaria 2 grupos, que poderiam ser usados ​​no modelo JMeter Regular Expression Extractor como $1$ e $ 2 $ .

O JMeter Regex Extractor salva os valores dos grupos em variáveis ​​adicionais.

Por exemplo, suponha:

  • Nome de referência: MYREF
  • Regex: nome="(.+?)" valor="(.+?)"
  • Modelo: $1$$2$
Não coloque a expressão regular em / /

As seguintes variáveis ​​seriam definidas:

MYREF
file.namereadme.txt
MYREF_g0
name="file.name" value="readme.txt"
MYREF_g1
nome do arquivo
MYREF_g2
leiame.txt
Essas variáveis ​​podem ser referenciadas posteriormente no plano de teste do JMeter, como ${MYREF} , ${MYREF_g1} etc.

21.3 Modo de linha

A correspondência de padrões se comporta de várias maneiras ligeiramente diferentes, dependendo da configuração dos modificadores de várias linhas e de uma única linha. Observe que os operadores de linha única e multilinha não têm nada a ver um com o outro; eles podem ser especificados independentemente.

Modo de linha única

O modo de linha única afeta apenas como o ' . ' meta-caractere é interpretado.

O comportamento padrão é esse ' . ' corresponde a qualquer caractere, exceto nova linha. No modo de linha única, ' . ' também corresponde à nova linha.

Modo multilinha

O modo de várias linhas afeta apenas como os meta-caracteres ' ^ ' e ' $ ' são interpretados.

O comportamento padrão é que ' ^ ' e ' $ ' correspondem apenas no início e no final da string. Quando o modo Multi-line é usado, o metacaractere ' ^ ' corresponde ao início de cada linha, e o metacaractere ' $ ' corresponde ao final de cada linha.

21.4 Metacaracteres

Expressões regulares usam certos caracteres como metacaracteres - esses caracteres têm um significado especial para o mecanismo RE. Esses caracteres devem ser escapados precedendo-os com \ (barra invertida) para tratá-los como caracteres comuns. Aqui está uma lista dos metacaracteres e seus significados (por favor, verifique a documentação do ORO em caso de dúvida).

( e )
agrupamento
[ e ]
classes de personagens
{ e }
repetição
* , + e ?
repetição
.
caractere curinga
\
caractere de escape
|
alternativas
^ e $
início e fim de string ou linha
Observe que ORO não suporta os meta-caracteres \Q e \E . [Em outros mecanismos de RE, eles podem ser usados ​​para citar uma parte de um RE para que os meta-caracteres representem eles mesmos.] Você pode usar a função para fazer o equivalente, consulte ${__escapeOroRegexpChars(valueToEscape)} .

As seguintes expressões regulares estendidas Perl5 são suportadas pelo ORO.

(?#texto)
Um comentário incorporado fazendo com que o texto seja ignorado.
(?:regexp)
Agrupa coisas como " () ", mas não faz com que a correspondência do grupo seja salva.
(?=regexp)
Uma asserção de antecipação positiva de largura zero. Por exemplo, \w+(?=\s) corresponde a uma palavra seguida de espaço em branco, sem incluir espaço em branco no MatchResult.
(?! regexp)
Uma asserção de antecipação negativa de largura zero. Por exemplo foo(?!bar) corresponde a qualquer ocorrência de " foo " que não seja seguida por " bar ". Lembre-se de que esta é uma afirmação de largura zero, o que significa que a(?!b)d corresponderá a ad porque a é seguido por um caractere que não é b (o d ) e a d segue a afirmação de largura zero.
(?imsx)
Um ou mais modificadores de correspondência de padrão incorporados. i habilita a diferenciação entre maiúsculas e minúsculas, m habilita o tratamento de várias linhas da entrada, s habilita o tratamento de linha única da entrada e x habilita comentários de espaço em branco estendidos.
Observe que (?<=regexp) - lookbehind - não é suportado.

21.5 Colocação de modificadores

Os modificadores podem ser colocados em qualquer lugar na regex e aplicados a partir desse ponto. [Um bug no ORO significa que eles não podem ser usados ​​no final da regex. No entanto, eles não teriam efeito lá de qualquer maneira.]

Os modificadores de linha única (?s) e multilinha (?m) são normalmente colocados no início da regex.

O modificador ignore-case (?i) pode ser aplicado de maneira útil a apenas parte de uma regex, por exemplo:

Corresponder ao caso ExAct ou (?i)ArBiTrARY(?-i)
corresponderia ao caso Match ExAct ou caso arbitrário , bem como ao caso Match ExAct ou caso ARBitrary , mas não corresponderia a caso exato ou caso ArBiTrARY .

21.6 Testando Expressões Regulares

Desde o JMeter 2.4, a Árvore de Resultados da Visualização do ouvinte inclui um RegExp Tester para testar expressões regulares diretamente nos dados de resposta do amostrador.

Existe um site para testar expressões regulares Java.

Outra abordagem é usar um plano de teste simples para testar as expressões regulares. O amostrador Java Request pode ser usado para gerar uma amostra ou o amostrador HTTP pode ser usado para carregar um arquivo. Adicione um Debug Sampler e um Tree View Listener e as alterações na expressão regular podem ser testadas rapidamente, sem a necessidade de acessar nenhum servidor externo.

Go to top