簡體   English   中英

匹配字符串中第一次出現的分號,只有前綴為' - '

[英]Match first occurrence of semicolon in string, only if not preceded by '--'

我正在嘗試編寫一個Java的正則表達式,如果有一個分號沒有兩個(或更多)前導' - '字符,則匹配。

我只能做相反的工作:一個至少有兩個前導' - '字符的分號。

([\-]{2,}.*?;.*)

但我需要類似的東西

([^([\-]{2,})])*?;.*

我不知道怎么說不能表達“至少兩個字符”。

以下是我需要使用表達式評估的一些示例:

; -- a           : should match
-- a ;           : should not match
-- ;             : should not match
--;              : should not match
-;-              : should match
---;             : should not match
-- semicolon ;   : should not match
bla ; bla        : should match
bla              : should not match (; is mandatory)
-;--;            : should match (the first occuring semicolon must not have two or more consecutive leading '-')

看來這個正則表達式匹配你想要的東西

String regex = "[^-]*(-[^-]+)*-?;.*";

DEMO

說明: matches將接受以下字符串:

  • [^-]*可以以非短划線字符開頭
  • (-[^-]+)*-?; 有點棘手,因為在我們匹配之前; 我們需要確保每一個-沒有另一個-在它之后:
    • (-[^-]+)*-具有至少一個非-后字符
    • -? -被放置在之前;
  • ;.*如果前面的條件滿足潔具我們可以接受的; 和之后的任何.*字符。

更易閱讀的版本,但可能會慢一點

((?!--)[^;])*;.*

說明:

確保有; 在字符串中我們可以在匹配中使用.*;.*
但我們需要先在角色中添加一些條件;

所以要確保匹配; 將是第一個我們可以寫這樣的正則表達式

[^;]*;.*

意思是:

  • [^;]*零個或多個非分號字符
  • ; 第一個分號
  • .*零個或多個任何字符(實際上.不能匹配\\n\\r \\n等行分隔符)

所以現在我們需要做的就是確保[^;]匹配的字符不是--一部分。 為此,我們可以使用環視機制,例如:

  • (?!--)[^;]匹配之前[^;] (?!--)檢查接下來的兩個字符是不是--換句話說, [^;]匹配的字符不能是第一個-在系列中兩個--
  • [^;](?<!--)檢查匹配后[^;]正則表達式引擎是否無法找到--如果它將回溯兩個位置,換句話說[^;]不能是最后一個字符系列--

你需要一個消極的向前看!

此正則表達式將匹配任何不包含原始匹配模式的字符串:

(?!-{2,}.*?;.*).*?;.*

此正則表達式匹配包含分號的字符串,但不包括在2個或更多短划線后出現的字符串。

例: 正則表達式工作

如何在Java中使用此正則表達式:

[^;]*;(?<!--[^;]{0,999};).*

唯一需要注意的是它在--和之間最多可以使用999字符長度;

Java Regex演示

如何只是拆分字符串--如果有兩個或更多子字符串,檢查最后一個字符串是否包含分號?

我想這就是你要找的東西:

^(?:(?!--).)*;.*$

換句話說,從字符串的開頭( ^ )匹配,零個或多個字符( .* )后跟分號。 但是用(?:(?!--).)替換點會使它匹配任何字符, 除非它是雙連字序列( -- )的開頭

如果性能是一個問題,您也可以排除分號,因此它永遠不必回溯:

^(?:(?!--|;).)*;.*$

編輯:我剛剛注意到你的評論,正則表達式應該使用matches()方法,所以我用.*填充它。 錨點並不是必需的,但它們沒有任何傷害。

暫無
暫無

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

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