我是新來的正則表達式。我試圖構造一個正則表達式,前三個字符必須是字母,然後字符串的其餘部分可以是任何字符。如果前三個字符後的字符串的部分包含&那麼這部分應該開始和結束」。if條件的正則表達式
我能夠構建^ [AZ] {3},但停留在條件語句。
燦這可以在一個單一的表達做
我是新來的正則表達式。我試圖構造一個正則表達式,前三個字符必須是字母,然後字符串的其餘部分可以是任何字符。如果前三個字符後的字符串的部分包含&那麼這部分應該開始和結束」。if條件的正則表達式
我能夠構建^ [AZ] {3},但停留在條件語句。
燦這可以在一個單一的表達做
在大多數正則表達式的口味,你可以使用簡單的向前看符號,以確保一些文本存在或不存在的地方到當前位置的右側,並使用交替操作|
有可能檢查替代品。
所以,我們基本上有兩種選擇:在前三個字母之後的字符串中有一個&
,或者不是。因此,我們可以用
^[A-Za-z]{3}(?:(?=.*&)".*"|(?!.*&).*)$
詳細:
^
- 字符串的開始[A-Za-z]{3}
- 3個字母(?:(?=.*&)".*"|(?!.*&).*)
- 無論是兩替代品:
(?=.*&)".*"
- 如果有一個&
某處的字符串((?=.*&)
)匹配"
,那麼任何0+字符,然後"
|
- 或(?!.*&).*
- 如果沒有&
((?!.*&)
)在字符串中,只需匹配任何0+字符即可...$
- 字符串結尾。在PCRE,或者.NET,或者一些其他的正則表達式的口味,你可以訪問條件結構。這裏是一個PCRE demo:
^[A-Za-z]{3}(?(?=.*&)".*"|.*)$
^^^^^^^^^^^^^^^^^
的(?(?=.*&)".*"|.*)
手段:
(?(?=.*&)
- 如果有&
之後的任何字符0+ ...".*"
- 比賽"anything here"
般串|
- 或者如果不存在&
.*
- 匹配當前位置的任何0+個字符(即之後的前3個字母)。是啊,這是可能的,這是不是一個真正的如果,但是你的情況,你可以做一個「或」用正則表達式捕獲組你的正則表達式看起來類似的東西:?
\d{3}(\".*\"|[^&]*)
PS here是一個很好的網站來測試和學習這些東西: https://regex101.com/
正則表達式不一定支持條件與'if'一樣,爲了在一般情況下實現這個條件,你必須聲明你的條件是可選的。 (但見Wiktor的的評論,這取決於你的正則表達式引擎有可能是可用的條件語句。)
對於一個相對基本的解決方案,你可以嘗試這樣的事:
^[a-z]{3}([^&]*|\..*\.)$
它說「後四個字母,應該有是任何長度的字符串,沒有符號(&)或字符串開始,以一個句號結束
請參閱https://msdn.microsoft.com /en-us/library/36xybswe(v=vs.110).aspx#Conditional_Expr –
Wiktor:有趣的擴展。值得一看,如果你的正則表達式引擎支持它。 – Jan
三個字母之後應該有一個任意長度的字符串,但即使在三個字母后沒有字符串,也可以工作。請你幫忙嗎? – user2359634
條件語句可以在使用()|。和羣體,但它可能會很複雜
^[a-z]{3}([^&]*$|".*"$)
你可能會考慮使用普通的舊的字符串操作完成這個任務,它可能會是簡單
^[a-z] {3}([^&] + $ |「。*」$)爲我工作。謝謝! – user2359634
本身將取決於你使用正則表達式解析器的表達。如果你使用Python,shell,vim,boost等,相同的符號可能有不同的含義。
我會嘗試以下方法:
$ echo 'abc"&def"' | grep -E "^[a-zA-Z]{3}(\".*\&.*\"|[^&]*)"
abc"&def"
你能給我們一個使用真實單詞的例子,結果是什麼? – Justplayit94
你可以用交替來做到這一點。例如'^ [az] {3}([^&] * |「。*」)$' – jsheeran
例如abcENT和abc「E&T」是有效的字符串,但不是abcE&T – user2359634