[英]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 = "[^-]*(-[^-]+)*-?;.*";
說明: matches
將接受以下字符串:
[^-]*
可以以非短划線字符開頭 (-[^-]+)*-?;
有點棘手,因為在我們匹配之前;
我們需要確保每一個-
沒有另一個-
在它之后:
(-[^-]+)*
每-
具有至少一個非-
后字符 -?
或-
被放置在之前;
;.*
如果前面的條件滿足潔具我們可以接受的;
和之后的任何.*
字符。 更易閱讀的版本,但可能會慢一點
((?!--)[^;])*;.*
說明:
確保有;
在字符串中我們可以在匹配中使用.*;.*
。
但我們需要先在角色中添加一些條件;
。
所以要確保匹配;
將是第一個我們可以寫這樣的正則表達式
[^;]*;.*
意思是:
[^;]*
零個或多個非分號字符 ;
第一個分號 .*
零個或多個任何字符(實際上.
不能匹配\\n
或\\r
\\n
等行分隔符) 所以現在我們需要做的就是確保[^;]
匹配的字符不是--
一部分。 為此,我們可以使用環視機制,例如:
(?!--)[^;]
匹配之前[^;]
(?!--)
檢查接下來的兩個字符是不是--
換句話說, [^;]
匹配的字符不能是第一個-
在系列中兩個--
[^;](?<!--)
檢查匹配后[^;]
正則表達式引擎是否無法找到--
如果它將回溯兩個位置,換句話說[^;]
不能是最后一個字符系列--
。 你需要一個消極的向前看!
此正則表達式將匹配任何不包含原始匹配模式的字符串:
(?!-{2,}.*?;.*).*?;.*
此正則表達式匹配包含分號的字符串,但不包括在2個或更多短划線后出現的字符串。
例:
如何只是拆分字符串--
如果有兩個或更多子字符串,檢查最后一個字符串是否包含分號?
我想這就是你要找的東西:
^(?:(?!--).)*;.*$
換句話說,從字符串的開頭( ^
)匹配,零個或多個字符( .*
)后跟分號。 但是用(?:(?!--).)
替換點會使它匹配任何字符, 除非它是雙連字序列( --
)的開頭 。
如果性能是一個問題,您也可以排除分號,因此它永遠不必回溯:
^(?:(?!--|;).)*;.*$
編輯:我剛剛注意到你的評論,正則表達式應該使用matches()
方法,所以我用.*
填充它。 錨點並不是必需的,但它們沒有任何傷害。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.