특정 기판을 포함하는 문자열을 무시하기 위해 정규 표현식을 어떻게 사용 하시겠습니까?

StackOverflow https://stackoverflow.com/questions/530441

  •  22-08-2019
  •  | 
  •  

문제

특정 하위 문자열이 포함 된 문자열을 무시하기 위해 부정적인 외관 (또는 다른 방법) 정규 표현식을 사용하는 방법은 무엇입니까?

이전 StackoverFlow 질문 두 가지를 읽었습니다.
Java-Regexp-for-File-Filtering
Regex-to-Match-Against-Specific-Substring이 아닙니다

그들은 거의 내가 원하는 것은 ... 내 문제는 문자열이 내가 무시하고 싶은 것으로 끝나지 않는다는 것입니다. 그렇게한다면 이것이 문제가되지 않을 것입니다.

나는 이것이 룩 어라운드가 0을 0이고 문자열을 통해 두 번째 패스에 일치한다는 사실과 관련이 있다는 느낌이 들었습니다.

어쨌든, 누군가가 시간을 기꺼이하고 설명하려면 나는 그것을 크게 감사하겠습니다.

다음은 내가 무시하고 싶은 입력 문자열의 예입니다.

192.168.1.10-- [08/Feb/2009 : 16 : 33 : 54-0800] "get/foo/bar/http/1.1"200 2246

다음은 추가 평가를 위해 유지하려는 입력 문자열의 예입니다.

192.168.1.10 - [08/Feb/2009 : 16 : 33 : 54-0800] "get /foo/bar/content.js http/1.1"200 2246

나에게 핵심은 문서 루트 기본 페이지 이후에 진행되는 HTTP get을 무시하고 싶다는 것입니다.

다음은 나의 작은 테스트 하네스와 지금까지 내가 생각해 낸 최고의 정규식입니다.

public static void main(String[] args){
String inString = "192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] \"GET /FOO/BAR/ HTTP/1.1\" 200 2246";
//String inString = "192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] \"GET /FOO/BAR/content.js HTTP/1.1\" 200 2246";
//String inString = "192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] \"GET /FOO/BAR/content.js HTTP/"; // This works
//String inString = "192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] \"GET /FOO/BAR/ HTTP/"; // This works
String inRegEx = "^.*(?:GET).*$(?<!.?/ HTTP/)";
try {
  Pattern pattern = Pattern.compile(inRegEx);

  Matcher matcher = pattern.matcher(inString);

  if (matcher.find()) {
    System.out.printf("I found the text \"%s\" starting at " +
"index %d and ending at index %d.%n",
matcher.group(), matcher.start(), matcher.end());
  } else {
    System.out.printf("No match found.%n");
  }
} catch (PatternSyntaxException pse) {
  System.out.println("Invalid RegEx: " + inRegEx);
  pse.printStackTrace();
}
}
도움이 되었습니까?

해결책

끝나지 않는 경로와 일치 할 수 있습니까? /

String inRegEx = "^.* \"GET (.*[^/]) HTTP/.*$";

이것은 또한 사용을 수행 할 수 있습니다 부정적인 외모

String inRegEx = "^.* \"GET (.+)(?<!/) HTTP/.*$";

여기, (?<!/) "The 선행 시퀀스가 있어야합니다 ~ 아니다 성냥 /".

다른 팁

어쩌면 나는 여기서 뭔가를 놓치고 있을지 모르지만 정기적 인 표현없이 가서 이것이 사실 인 것을 무시할 수는 없습니다.

string.contains("/ HTTP")

파일 경로는 슬래시로 끝나지 않기 때문입니다.

나는 다음과 같은 것을 사용할 것입니다.

"\"GET /FOO/BAR/[^ ]+ HTTP/1\.[01]\""

이것은 단지 모든 경로와 일치합니다 /FOO/BAR/.

이 단지를 Regex를 작성하는 경우 StackoverFlow 외부에서 자원 라이브러리를 구축하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top