2017-04-10 1 views
-2

Java 정규 표현식 패키지 java.util.regex를 사용하는 Pentaho에서 작업 중입니다. 내가 무시하고 시도 할 문자열의 긴 부분이Regex - 문자열의 일부를 무시하십시오.

^StartofString Controls\(param1="(D[0-9]{0,})",param2="(G[0-9]{0,})",param3="([^"]{0,})",param4="([^"]{0,})"\):(?:.*)param5="([^"]{0,})",.* 

:

는 둘 다 시작하고 문자열의 끝에서 텍스트 파일의 라인에서 많은 정보를 추출 할 do with so (?:.*)

단계에서 Regex를 테스트했지만 변환을 실행할 때 긍정적 인 Lookahead가 작동하는 것 같습니다. 나는 '필터 행'자바 스크립트 단계에서 이전 단계 및 추출 그룹의 부울 확인, '정규식 평가'단계에 문자열을 테스트 : patterStr가에서보다 같은 정규식 인과

var pattern = Packages.java.util.regex.Pattern.compile(patternStr); 
var matcher = pattern.matcher(content.toString()); 
var matchFound = matcher.find(); 

' 정규식에서 문자열의 일부를 무시하는 것에 대해 많은 질문을 읽었지만 여전히 답을 찾을 수 없습니다. 도움이됩니다. 필요한 경우 더 많은 정보를 제공 할 수 있습니다.

+3

아무 생각이 무엇인지 너의 문제는. 한 가지 확실한 것은 :'(? :. *)'는 비 캡처 그룹이며 미리보기가 아닙니다. –

+0

변환 코드를 볼 수 있습니까? 비 캡처 그룹을 사용하면 트릭을 수행하지 않습니다. 비 캡처 그룹은 캡처 그룹이 없음을 의미하지만 일치하는 텍스트는 여전히 출력에 있습니다. 그냥 그룹에 없어요 – Aaron

+0

... 나는 비 캡처 그룹과 미리보기를 섞어 놓았습니다. 내가 원하는 것은 param5에 도달 할 때까지 문자열의 큰 부분을 캡처하지 않는 것입니다. 전체 변형을 보는 것이 어떻게 도움이되는지 확실하지 않으며 내가 보여서는 안되는 합리적인 정보가 있습니다. – v01dv01d

답변

1

비 캡처 그룹은 내용이 캡처되지 않는다는 것을 의미하지는 않습니다. 이는 그룹에서 캡처되지 않는다는 것을 의미합니다 (여전히 정규 표현식에서 토큰을 그룹화하고 있지만 유용 할 수 있음). 한 번에 수정 자 적용).

예를 들어, 이러한 정규 표현식은 모두 동일한 abc 문자열과 일치합니다

abc 
a(?:b)c 
a(b)c 

그러나 세 번째 경우에, 당신은 독립적으로 b에 액세스 할 수 있도록하는 캡처 그룹을 정의했습니다. 처음 두 경우는 모든면에서 동등합니다.

비 캡처 그룹은 나중에 참조 할 수있는 추가 그룹이 없어도 토큰 그룹에 수정자를 적용하려는 경우에 유용합니다. 다음 정규식 등에서 특정 요소를 뽑아 오기는 모두 같은 문자열을 일치 :

(ab)*(c)\2 
(?:ab)*(c)\1 

우리는 ab 토큰에 *을 적용 할. 캡처 그룹 (첫 번째 예)을 사용하거나 참조 할 수있는 그룹이 만들어 지거나 비 캡처 그룹을 사용합니다. 정규식의 끝에있는 역 참조는 c과 일치해야합니다. 첫 번째 예에서는 ab이 첫 번째 그룹이기 때문에 두 번째 그룹이고 두 번째 그룹에서는 두 번째 그룹 인 반면 c은 참조 할 수있는 첫 번째 그룹입니다.

캡쳐되지 않은 그룹이하는 일에 대해 설명 했으므로 문제의 해결을 시도해 보겠습니다. 문자열 가운데에서 무언가를 제거하고 싶습니다. 처음에는 무엇이 있고 마지막에는 무엇이 있는지를 알고 싶습니다.

Aremove-thisB 

그리고 당신은 결과 AB을 원하는 :

의 당신이 일치 할 문자열을 가정 해 봅시다

는 다음과 같습니다.

그렇게 여러 전략이 있습니다, 귀하의 경우 가장 쉬운 방법은 아마도 자신의 캡처 그룹에 문자열의 시작과 끝 모두 일치하고 거기에서 출력을 생성하는 것입니다 :

var pattern = Packages.java.util.regex.Pattern.compile("(A).*(B)"); 
var matcher = pattern.matcher(content.toString()); 
var matchFound = matcher.find(); 
if (matchFound) { return matcher.group(1) + matcher.group(2); } 
+0

정확한 답변을 주셔서 감사하지만 여전히 내 질문에 완전히 대답하지 않습니다. 일치시키고 자하는 문자열은 다음과 같습니다. 'A = text1, remove-this, B = text2' 그리고 text1과 text2를 별도로 캡처하고 싶습니다. – v01dv01d

+0

@ v01dv01d는 'text1'을 참조 할 수 있도록 캡처 그룹을 사용합니다. 와'text2'는 독립적으로 : A = ([^,] *). * B = ([^,] *)'와 일치하면, 정규 표현식의 .group (1)은'text1'과'. group (2)''text2'. '[^,] *'는 다음 쉼표까지 모든 것을 일치시킬 것입니다. – Aaron

+0

저는 논리를 가지고 시도했지만 여전히 작동하지 않습니다. 글쎄, 지금까지 정규식 보이는 방법입니다 : '^ GetAndUpdate pcParamQualite \ (sDomaineApplicatif = "(D [0-9] {0,})", sApplication = "(G [0-9] {0,}), sFonctionnalite = "([^"] {0,}) ", sNumeroOrdre ="([^ "] {0,})"\) :. * sCodeMsgExpliControle = "([^"] {0,}) ",. *' 무시하고 싶은 것은 콜론과 sCodeMsgExpliControle 사이에 있습니다. (그 이후에는 더 많은 내용이 있습니다. 예를 들어 잘라냅니다.) – v01dv01d

관련 문제