2016-09-03 3 views
-1

요청 텍스트를 "_"로 바꾸고 싶습니다.정규식 그룹화를 사용하여 패턴의 모든 인스턴스를 제거하는 방법

자바 그룹핑 정규식 구문을 사용하려고 생각했습니다. 하지만 엉망이 됐어. 여기

내 입력 :

요청 0을 처리하는 데 실패 [널 (null) 종료> 널 S : 0 W : 0.0 A : 0.0 S : 0 T : 24,543,060 S (NA) (0, 0)] 주제 RealTimeUpdate에

예상 출력 :

RealTimeUpdate

주제에 _ 요청을 처리하지 못했습니다

파트 B

어떻게 텍스트에서이 패턴의 모든 인스턴스를 제거 할 수 있습니까?

입력 :

요청 0을 처리하는 데 실패 [널 (null) 종료> 널 S : 0 W : 0.0 A : 0.0 S : 0 T : 24,543,060 S (NA) (0, 0)] 자기 RealTimeUpdate에 . 요청 하였다 : 0 [널 (null) 종료> 널 S : 0 w : 0.0 A : 0.0 S : 0 T : 24,543,060 S (NA) (0, 0)]

예상 출력 :

실패 제목 RealTimeUpdate에 대한 요청 _을 처리합니다. 요청했다 : _ 여기

내 시도입니다 :

Pattern p = Pattern.compile("(\"Failed to handle request\")(\\d)("[")(.*)(\"]\")(.*)"); 
Matcher m = p.matcher(input); 
if (m.find()) { 
    String output = m.replaceAll("$1"+"$2"+"$3"+"_"+"$5"+"$6"); 
} 

또는 내가 패턴이 "[null->null"로 시작 약속 해요 경우

:

str.replaceAll((\\d)(\"[null->null\")(*.)(\"]\")", "X"); 
+0

무엇을 수정해야합니까? 괜찮 니? –

+0

컴파일 가능한 Java 코드처럼 보이지 않습니다. – hyde

답변

1

난 몰라 이제 요청 구문이 정확하지만 숫자 뒤에 대괄호로 묶인 텍스트가 있다고 가정하면 str = str.replaceAll("\\d\\[.*?\\]", "_");을 사용할 수 있습니다.

+0

고정 된 텍스트를 패턴 시작 부분에 어떻게 추가 할 수 있습니까? 이런 식으로 '요청'이란 말을하니? 'str.replaceAll ("요청 \\ d \\ [. *? \\]", "_"); ' –

+0

네, 고정 테스트를 처음에 추가 할 수 있습니다. 그러나 나머지 패턴과 함께 단어 요청을 대체합니다. – uoyilmaz

+0

그리고 "요청"을 남기고 싶다면 @Zabuza 대답처럼 그룹화를 사용해야합니다. –

1

Failed to handle requeston subject.* 사이에 들어오는 모든 것을 제거하려면 실제로 Java 정규식 그룹을 사용할 수 있습니다.

output = input; 
Pattern pattern = Pattern.compile("(Failed to handle request).+(on subject.*)"); 
Matcher matcher = pattern.matcher(input); 
if (matcher.find()) { 
    String beforeRequest = matcher.group(1); 
    String afterRequest = matcher.group(2); 
    output = beforeRequest + "_" + afterRequest; 
} 

가의 바늘을 살펴 보자는 Pattern :

(Failed to handle request).+(on subject.*) 

빠른

output = input; 
Pattern pattern = Pattern.compile("Failed to handle request (.+) on subject.*"); 
Matcher matcher = pattern.matcher(input); 
if (matcher.find()) { 
    String request = matcher.group(1); 
    output = input.replace(request, "_"); 
} 

요청 제외한 모든 잡을 후 함께 넣어하는 것입니다 방법은 다음과 같습니다 : 여기에서 설명을 찾을 수 있습니다 : https://regex101.com/r/xB6yW8/1

+0

'output = input.replace (request, "_");'단 하나의 인스턴스 만 바꾸지 않겠습니까? –

+0

첫 번째 인스턴스를 대체합니다. 그러나 정규 표현식은 첫 번째 요청 만 찾습니다. 입력 (각각의 요청 행에 대해 하나의'String')을 분리하거나'while (matcher.find()) {...} '와 같은 것을하고 하나의 어커런스를 다른 것으로 대체 할 수 있습니다. – Zabuza

2

제로 폭 po 친절한 표정 :

str.replaceAll("(?<=request)\\d\\[.*?\\]", "_"); 
+0

Java-Regex가 lookbehind 할 수 있습니까? Afaik Java-Regex는 Perl이나 PHP Regex보다 훨씬 약합니다. – Zabuza

+0

모르겠지만 [여기] (https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#sum)에 언급되어 있습니다. – redneb

관련 문제