[英]Regex to match against something that is not a specific substring
我正在尋找一個匹配字符串的正則表達式,該字符串以一個子字符串開頭,並且不以某個子字符串結尾。
例:
// Updated to be correct, thanks @Apocalisp
^foo.*(?<!bar)$
應匹配任何以“foo”開頭並且不以“bar”結尾的內容。 我知道[^ ...]語法,但我找不到任何能為字符串而不是單個字符做的事情。
我特意嘗試為Java的正則表達式做這個,但我已經遇到過這個問題,所以其他正則表達式引擎的答案也會很棒。
感謝@Kibbee驗證這也適用於C#。
我想在這種情況下你想要負面的背后照 ,就像這樣:
foo.*(?<!bar)
我不熟悉Java正則表達式,但是模式類的文檔建議你可以使用(?!X)非捕獲零寬度負向前瞻(它在那個帖子中查找不是X的東西,而不是捕獲它作為反向引用)。 所以你可以這樣做:
foo.*(?!bar) // not correct
更新 :Apocalisp是對的,你想要負面的背后。 (你正在檢查。*匹配不會以條形結束)
已驗證@ 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中,您可以使用以下模式:
"^first_string(?!.?second_string)\\z"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.