특정 하위 문자열이 아닌 항목과 일치하는 정규식
-
09-06-2019 - |
문제
하나의 하위 문자열로 시작하고 특정 하위 문자열로 끝나지 않는 문자열과 일치하는 정규식을 찾고 있습니다.
예:
// 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이 올 수 없음을 의미합니다.
제휴하지 않습니다 StackOverflow