簡體   English   中英

正則表達式匹配不是特定子字符串的東西

[英]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"
  • ^ - 確保字符串以first_string開頭
  • \\ z - 確保字符串以second_string結尾
  • (?!。?second_string) - 表示first_string不能跟隨second_string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM