21. 정규 표현식

21.1 개요

JMeter에는 패턴 일치 소프트웨어 Apache Jakarta ORO
가 포함되어 있습니다. 자카르타 웹사이트에는 이에 대한 문서가 있습니다(예 : 패턴 일치 문자 요약).

OROMatcher User's guide 에는 제품의 이전 구현에 대한 문서도 있습니다 . 유용할 수 있습니다.

패턴 매칭은 Perl의 패턴 매칭과 매우 유사합니다. Perl의 전체 설치에는 정규 표현식에 대한 많은 문서가 포함됩니다 . perlrequick , perlretut , perlreperlreref 를 찾으십시오 .

Response Assertion 테스트 요소에서 사용되는 " 포함 "과 " 일치 " 의 차이점을 강조할 가치가 있습니다.

" 포함 "
정규식이 대상의 적어도 일부와 일치함을 의미하므로 ' alphabet ' " 에는 " ' ph.b 가 포함됩니다. ' 정규식이 하위 문자열 ' phabe '와 일치하기 때문입니다.
" 일치 "
정규식이 전체 대상과 일치했음을 의미합니다. 따라서 ' alphabet '은 ' al.*t '와 " 일치 "됩니다 .

이 경우 정규식을 ^$ , 즉 ' ^al.*t$ '로 래핑하는 것과 같습니다.

그러나 항상 그런 것은 아닙니다. 예를 들어, 정규식 ' alp|.lp.* '는 ' alphabet '에 " 포함되어 있지만 " ' alphabet '과 " 일치 하지 " 않습니다 .

왜요? 패턴 일치자가 ' alphabet '에서 시퀀스 ' alp '를 찾으면 다른 조합 시도를 중지하고 ' alp '는 ' habet ' 을 포함하지 않기 때문에 ' alpha ' 와 동일 하지 않기 때문 입니다.

Perl과 달리 // 에 정규 표현식을 포함할 필요가 없습니다 .

따라서 후행 / 가 없으면 수정자 ismx 등을 어떻게 사용 합니까? 해결책은 확장 정규식 을 사용하는 것입니다 . 즉, /abc/i(?i)abc 가 됩니다. 아래 의 수정자 배치도 참조하십시오 .

21.2 예제

단일 문자열 추출


웹 페이지의 name="file" value="readme.txt"> 부분과 일치시키고 readme.txt
를 추출하려고 한다고 가정합니다 . 적합한 정규식은 다음과 같습니다. name="file" value="(.+?)">

위의 특수 문자는 다음과 같습니다.

()
이들은 반환될 일치 문자열의 일부를 묶습니다.
.
어떤 문자와도 일치
+
한 번 이상
?
욕심내지 마세요. 첫 번째 경기가 성공하면 멈추세요.

참고: 없이 ? , .+ 는 마지막 가능한 "> 를 찾을 때까지 첫 번째 "> 를 지나 계속됩니다 . 이는 아마도 의도한 것이 아닐 것입니다.

참고: 위의 표현식이 작동하더라도 다음 표현식을 사용하는 것이 더 효율적입니다.
name="file" value="([^"]+)"> 여기서
[^"] - " 를 제외한 모든 것과 일치함을 의미합니다
. 이 경우 일치하는 엔진은 첫 번째 "" 를 보자마자 찾는 것을 멈출 수 있지만, 이전의 경우 엔진은 " > 라고 말하는 대신 "> 를 찾았는지 확인해야 합니다 .

여러 문자열 추출


웹 페이지의 name="file.name" value="readme.txt" 부분과 일치시키고 file.namereadme.txt 를 모두 추출하려고 한다고 가정합니다 .
적절한 정규식은 다음과 같습니다.
name="([^"]+)" value="([^"]+)"
JMeter Regular Expression Extractor 템플릿에서 $1$$2$ .

JMeter Regex Extractor는 그룹의 값을 추가 변수에 저장합니다.

예를 들어 다음과 같이 가정합니다.

  • 참조 이름: MYREF
  • 정규식: 이름="(.+?)" 값="(.+?)"
  • 템플릿: $1$$2$
// 에 정규 표현식을 묶지 마십시오.

다음 변수가 설정됩니다.

마이레프
파일.이름읽기.txt
MYREF_g0
이름="파일 이름" 값="readme.txt"
MYREF_g1
파일 이름
MYREF_g2
readme.txt
이러한 변수는 나중에 JMeter 테스트 계획에서 ${MYREF} , ${MYREF_g1} 등 으로 참조할 수 있습니다.

21.3 라인 모드

패턴 일치는 여러 줄 및 한 줄 수정자의 설정에 따라 약간 다른 방식으로 작동합니다. 한 줄 연산자와 여러 줄 연산자는 서로 관련이 없습니다. 독립적으로 지정할 수 있습니다.

단일 라인 모드

단일 라인 모드는 ' . ' 메타 문자가 해석됩니다.

기본 동작은 ' 입니다. '는 개행 문자를 제외한 모든 문자와 일치합니다. 단일 라인 모드에서 ' . '도 줄 바꿈과 일치합니다.

다중 라인 모드

다중 행 모드는 메타 문자 ' ^ ' 및 ' $ '가 해석되는 방식에만 영향을 줍니다.

기본 동작은 ' ^ ' 및 ' $ '가 문자열의 맨 처음과 끝에서만 일치하는 것입니다. Multi-line 모드를 사용하는 경우 ' ^ ' 메타 문자는 모든 줄의 시작 부분에서 일치하고 ' $ ' 메타 문자는 모든 줄의 끝에서 일치합니다.

21.4 메타 문자

정규식은 특정 문자를 메타 문자로 사용합니다. 이러한 문자는 RE 엔진에 특별한 의미를 갖습니다. 이러한 문자 를 일반 문자로 처리하려면 앞에 \ (백슬래시)를 붙여 이스케이프해야 합니다. 다음은 메타 문자 목록과 그 의미입니다(확실하지 않은 경우 ORO 문서를 확인하십시오).

()
그룹화
[]
캐릭터 클래스
{}
되풀이
* , +?
되풀이
.
와일드카드 문자
\
이스케이프 문자
|
대안
^$
문자열 또는 줄의 시작과 끝
ORO는 \Q\E 메타 문자 를 지원하지 않습니다 . [다른 RE 엔진에서는 메타 문자가 스스로를 나타내도록 RE의 일부를 인용하는 데 사용할 수 있습니다.] 함수를 사용하여 동등한 작업을 수행할 수 있습니다 (${__escapeOroRegexpChars(valueToEscape)} 참조) .

다음 Perl5 확장 정규식은 ORO에서 지원됩니다.

(?#텍스트)
텍스트가 무시되도록 하는 포함된 주석입니다.
(?:정규식)
" () " 와 같은 것을 그룹화하지만 그룹 일치를 저장하지 않습니다.
(?=정규 표현식)
너비가 0인 긍정적 예측 어설션입니다. 예를 들어 \w+(?=\s) 는 MatchResult에 공백을 포함하지 않고 공백이 뒤에 오는 단어와 일치합니다.
(?! 정규 표현식)
너비가 0인 부정 lookahead 어설션입니다. 예를 들어 foo(?!bar) 는 " bar " 가 뒤따르지 않는 " foo " 와 일치합니다 . 이것은 너비가 0인 주장임을 기억하십시오. 이는 a 다음에 b 가 아닌 문자 ( d )가 오고 a d 가 너비가 0인 주장을 따르기 때문에 a (?!b)d 가 ad 와 일치 한다는 것을 의미합니다 .
(? imsx)
하나 이상의 포함된 패턴 일치 수정자. i 는 대소문자 구분을 활성화하고, m 은 입력의 여러 줄 처리를 활성화하고, s 는 입력의 한 줄 처리를 활성화하고, x 는 확장된 공백 주석을 활성화합니다.
(?<=regexp) - lookbehind -는 지원되지 않습니다 .

21.5 수정자 배치

수정자는 정규식의 아무 곳에나 배치할 수 있으며 해당 지점부터 적용할 수 있습니다. [ORO의 버그는 정규식의 맨 끝에 사용할 수 없음을 의미합니다. 그러나 그들은 어쨌든 거기에 영향을 미치지 않을 것입니다.]

한 줄 (?s) 및 여러 줄 (?m) 수정자는 일반적으로 정규식 시작 부분에 배치됩니다.

대소문자 무시 수정자 (?i) 는 다음과 같이 정규식의 일부에만 유용하게 적용될 수 있습니다.

ExAct 케이스 또는 (?i)ArBiTrARY(?-i) 케이스 일치
Match ExAct 케이스 또는 임의의 케이스 는 물론 Match ExAct 케이스 또는 ARBitrary 케이스 와 일치하지만 Match Exact 케이스 또는 ArBiTrARY 케이스는 일치 하지 않습니다 .

21.6 정규 표현식 테스트

JMeter 2.4부터 리스너 보기 결과 트리 에는 샘플러 응답 데이터에서 직접 정규식을 테스트하기 위한 RegExp 테스터가 포함되어 있습니다.

Java 정규식을 테스트 하는 웹사이트 가 있습니다.

또 다른 접근 방식은 간단한 테스트 계획을 사용하여 정규식을 테스트하는 것입니다. Java 요청 샘플러를 사용하여 샘플을 생성하거나 HTTP 샘플러를 사용하여 파일을 로드할 수 있습니다. 디버그 샘플러와 트리 보기 수신기를 추가하면 외부 서버에 액세스할 필요 없이 정규식에 대한 변경 사항을 빠르게 테스트할 수 있습니다.

Go to top