문제

하나의 하위 문자열로 시작하고 특정 하위 문자열로 끝나지 않는 문자열과 일치하는 정규식을 찾고 있습니다.

예:

// Updated to be correct, thanks @Apocalisp
^foo.*(?<!bar)$

"foo"로 시작하고 "bar"로 끝나지 않는 모든 항목과 일치해야 합니다.[^...] 구문에 대해 알고 있지만 단일 문자 대신 문자열에 대해 해당 기능을 수행하는 항목을 찾을 수 없습니다.

나는 특히 Java의 정규식에 대해 이 작업을 수행하려고 시도하고 있지만 이전에 이 문제를 겪었으므로 다른 정규식 엔진에 대한 답변도 좋을 것입니다.

이것이 C#에서도 작동하는지 확인한 @Kibbee에게 감사드립니다.

도움이 되었습니까?

해결책

이 경우에는 당신이 원하는 것 같아요 부정적인 뒤돌아보기, 다음과 같습니다:

foo.*(?<!bar)

다른 팁

다음을 사용하여 @Apocalisp의 답변을 확인했습니다.

import java.util.regex.Pattern;
public class Test {
  public static void main(String[] args) {
    Pattern p = Pattern.compile("^foo.*(?<!bar)$");
    System.out.println(p.matcher("foobar").matches());
    System.out.println(p.matcher("fooBLAHbar").matches());
    System.out.println(p.matcher("1foo").matches());
    System.out.println(p.matcher("fooBLAH-ar").matches());
    System.out.println(p.matcher("foo").matches());
    System.out.println(p.matcher("foobaz").matches());
  }
}

그러면 올바른 답변이 출력됩니다.

false
false
false
true
true
true

나는 Java 정규식에 익숙하지 않지만 패턴 클래스 캡처하지 않는 너비가 0인 부정 예측에 (?!X)를 사용할 수 있다고 제안합니다(역참조로 캡처하지 않고 해당 위치에서 X가 아닌 항목을 찾습니다).그래서 당신은 할 수 있습니다 :

foo.*(?!bar) // not correct

업데이트:Apocalisp의 말이 맞습니다. 당신은 부정적인 뒷모습을 원합니다.(.* 일치 항목이 bar로 끝나지 않는지 확인하고 있습니다)

다른 논평자들이 말했듯이 부정적인 전망이 필요합니다.Java에서는 다음 패턴을 사용할 수 있습니다.

"^first_string(?!.?second_string)\\z"
  • ^ - String이 First_string으로 시작하도록합니다
  • \z - 문자열이 second_string으로 끝나는지 확인합니다.
  • (?!.?second_string) - first_string 뒤에 second_string이 올 수 없음을 의미합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top