2016-08-30 221 views
4

我是新來的正則表達式。我試圖構造一個正則表達式,前三個字符必須是字母,然後字符串的其餘部分可以是任何字符。如果前三個字符後的字符串的部分包含&那麼這部分應該開始和結束」。if條件的正則表達式

我能夠構建^ [AZ] {3},但停留在條件語句。

燦這可以在一個單一的表達做

+5

你能給我們一個使用真實單詞的例子,結果是什麼? – Justplayit94

+1

你可以用交替來做到這一點。例如'^ [az] {3}([^&] * |「。*」)$' – jsheeran

+0

例如abcENT和abc「E&T」是有效的字符串,但不是abcE&T – user2359634

回答

3

在大多數正則表達式的口味,你可以使用簡單的向前看符號,以確保一些文本存在或不存在的地方到當前位置的右側,並使用交替操作|有可能檢查替代品。

所以,我們基本上有兩種選擇:在前三個字母之後的字符串中有一個&,或者不是。因此,我們可以用

^[A-Za-z]{3}(?:(?=.*&)".*"|(?!.*&).*)$ 

regex demo

詳細

  • ^ - 字符串的開始
  • [A-Za-z]{3} - 3個字母
  • (?:(?=.*&)".*"|(?!.*&).*) - 無論是兩替代品:
    • (?=.*&)".*" - 如果有一個&某處的字符串((?=.*&))匹配",那麼任何0+字符,然後"
    • | - 或
    • (?!.*&).* - 如果沒有&(?!.*&))在字符串中,只需匹配任何0+字符即可...
  • $ - 字符串結尾。

在PCRE,或者.NET,或者一些其他的正則表達式的口味,你可以訪問條件結構。這裏是一個PCRE demo

^[A-Za-z]{3}(?(?=.*&)".*"|.*)$ 
      ^^^^^^^^^^^^^^^^^ 

(?(?=.*&)".*"|.*)手段:

  • (?(?=.*&) - 如果有&之後的任何字符0+ ...
  • ".*" - 比賽"anything here"般串
  • | - 或者如果不存在&
  • .* - 匹配當前位置的任何0+個字符(即之後的前3個字母)。
0

是啊,這是可能的,這是不是一個真正的如果,但是你的情況,你可以做一個「或」用正則表達式捕獲組你的正則表達式看起來類似的東西:?

\d{3}(\".*\"|[^&]*) 

PS here是一個很好的網站來測試和學習這些東西: https://regex101.com/

0

正則表達式不一定支持條件與'if'一樣,爲了在一般情況下實現這個條件,你必須聲明你的條件是可選的。 (但見Wiktor的的評論,這取決於你的正則表達式引擎有可能是可用的條件語句。)

對於一個相對基本的解決方案,你可以嘗試這樣的事:

^[a-z]{3}([^&]*|\..*\.)$ 

它說「後四個字母,應該有是任何長度的字符串,沒有符號(&)或字符串開始,以一個句號結束

+0

請參閱https://msdn.microsoft.com /en-us/library/36xybswe(v=vs.110).aspx#Conditional_Expr –

+0

Wiktor:有趣的擴展。值得一看,如果你的正則表達式引擎支持它。 – Jan

+0

三個字母之後應該有一個任意長度的字符串,但即使在三個字母后沒有字符串,也可以工作。請你幫忙嗎? – user2359634

1

條件語句可以在使用()|。和羣體,但它可能會很複雜

^[a-z]{3}([^&]*$|".*"$) 

你可能會考慮使用普通的舊的字符串操作完成這個任務,它可能會是簡單

+0

^[a-z] {3}([^&] + $ |「。*」$)爲我工作。謝謝! – user2359634

0

本身將取決於你使用正則表達式解析器的表達。如果你使用Python,shell,vim,boost等,相同的符號可能有不同的含義。

我會嘗試以下方法:

$ echo 'abc"&def"' | grep -E "^[a-zA-Z]{3}(\".*\&.*\"|[^&]*)" 
abc"&def"