21. 정규 표현식 ¶
21.1 개요 ¶
JMeter에는 패턴 일치 소프트웨어 Apache Jakarta ORO
가 포함되어 있습니다. 자카르타 웹사이트에는 이에 대한 문서가 있습니다(예
: 패턴 일치 문자 요약).
OROMatcher User's guide 에는 제품의 이전 구현에 대한 문서도 있습니다 . 유용할 수 있습니다.
패턴 매칭은 Perl의 패턴 매칭과 매우 유사합니다. Perl의 전체 설치에는 정규 표현식에 대한 많은 문서가 포함됩니다 . perlrequick , perlretut , perlre 및 perlreref 를 찾으십시오 .
Response Assertion 테스트 요소에서 사용되는 " 포함 "과 " 일치 " 의 차이점을 강조할 가치가 있습니다.
- " 포함 "
- 정규식이 대상의 적어도 일부와 일치함을 의미하므로 ' alphabet ' " 에는 " ' ph.b 가 포함됩니다. ' 정규식이 하위 문자열 ' phabe '와 일치하기 때문입니다.
- " 일치 "
- 정규식이 전체 대상과 일치했음을 의미합니다. 따라서 ' alphabet '은 ' al.*t '와 " 일치 "됩니다 .
이 경우 정규식을 ^ 및 $ , 즉 ' ^al.*t$ '로 래핑하는 것과 같습니다.
그러나 항상 그런 것은 아닙니다. 예를 들어, 정규식 ' alp|.lp.* '는 ' alphabet '에 " 포함되어 있지만 " ' alphabet '과 " 일치 하지 " 않습니다 .
왜요? 패턴 일치자가 ' alphabet '에서 시퀀스 ' alp '를 찾으면 다른 조합 시도를 중지하고 ' alp '는 ' habet ' 을 포함하지 않기 때문에 ' alpha ' 와 동일 하지 않기 때문 입니다.
따라서 후행 / 가 없으면 수정자 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.name 및 readme.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
21.3 라인 모드 ¶
패턴 일치는 여러 줄 및 한 줄 수정자의 설정에 따라 약간 다른 방식으로 작동합니다. 한 줄 연산자와 여러 줄 연산자는 서로 관련이 없습니다. 독립적으로 지정할 수 있습니다.
단일 라인 모드
단일 라인 모드는 ' . ' 메타 문자가 해석됩니다.
기본 동작은 ' 입니다. '는 개행 문자를 제외한 모든 문자와 일치합니다. 단일 라인 모드에서 ' . '도 줄 바꿈과 일치합니다.
다중 라인 모드
다중 행 모드는 메타 문자 ' ^ ' 및 ' $ '가 해석되는 방식에만 영향을 줍니다.
기본 동작은 ' ^ ' 및 ' $ '가 문자열의 맨 처음과 끝에서만 일치하는 것입니다. Multi-line 모드를 사용하는 경우 ' ^ ' 메타 문자는 모든 줄의 시작 부분에서 일치하고 ' $ ' 메타 문자는 모든 줄의 끝에서 일치합니다.
21.4 메타 문자 ¶
정규식은 특정 문자를 메타 문자로 사용합니다. 이러한 문자는 RE 엔진에 특별한 의미를 갖습니다. 이러한 문자 를 일반 문자로 처리하려면 앞에 \ (백슬래시)를 붙여 이스케이프해야 합니다. 다음은 메타 문자 목록과 그 의미입니다(확실하지 않은 경우 ORO 문서를 확인하십시오).
- ( 및 )
- 그룹화
- [ 및 ]
- 캐릭터 클래스
- { 및 }
- 되풀이
- * , + 및 ?
- 되풀이
- .
- 와일드카드 문자
- \
- 이스케이프 문자
- |
- 대안
- ^ 및 $
- 문자열 또는 줄의 시작과 끝
다음 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 는 확장된 공백 주석을 활성화합니다.
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 샘플러를 사용하여 파일을 로드할 수 있습니다. 디버그 샘플러와 트리 보기 수신기를 추가하면 외부 서버에 액세스할 필요 없이 정규식에 대한 변경 사항을 빠르게 테스트할 수 있습니다.