2016-06-28 40 views
1

正則表達式匹配中期:{=tokenstring[^{}]*(?:{[^{}]*}[^{}]*)*}/g匹配這個字符串正確:修改一個單一的正則表達式也從一個字符串

{=tokenstring?param1=11&param2={token-identifier}&param3={token-child-identifier}&param4=20} 

(即是正在被使用的令牌我它基於提供的內容頁面中的請求數據動態地改變值。)

我想再向RegEx添加一個條件。例如「param3」,找到它是否存在或不在字符串

我知道這個新正則表達式/param3=([^&])/將從得到了這個詞「參數3」,但如何適應新的正則表達式到原來的正則表達式

+1

你可能可以用正則表達式來完成這個工作,但是如果你可以先用'&',然後再用'='來分割字符串,那麼你可以大大簡化這個問題。你目前使用什麼工具/語言? –

+0

你是說你想要'param3'的值,或者你想確定param3是否存在,如果不匹配? – abc123

+0

1.我正在使用這個正則表達式工具:http://regexr.com/ 2.想要檢查param3是否存在於上面的引用字符串中。 3. TIm:分割字符串可能無法在這裏工作,因爲我需要使用此RegEx進行數據庫查詢。 –

回答

0

一個在線調試器的試驗性實驗。之前:

{=tokenstring[^{}]*(?:{[^{}]*}[^{}]*)*} 

Regular expression visualization

Debuggex Demo "before"

後:

{=tokenstring[^{}]*(?:{[^{}]*}[^{}]*)*param3=(?:{[^{}]*}[^{}]*)*} 

Regular expression visualization

Debuggex Demo "after"

+0

感謝agc的解決方案。這對我有效。 –

0

如果您沒有固定數量的參數,這意味着您無法編寫單個正則表達式,因爲您無法使用動態數量的組創建正則表達式。但是,您可以遍歷匹配。例如,在PHP它看起來像這樣

#Check if token is right 
if (preg_match('/\A\{=tokenstring\?param.+\}\Z/s', $subject)) { 
    # Successful match. Now iterate over tokens and their params 
    preg_match_all('/(param\d+)=(.+?)(?:&|(?:\}$))/s', $subject, $result, PREG_SET_ORDER); 
    for ($matchi = 0; $matchi < count($result); $matchi++) { 
     $param = $result[$matchi][0]; 
     $param_value = $result[$matchi][1]; 
    } 
} else { 
    # Match attempt failed 
} 

更新:我可以用一個正則表達式能做的就是當一個參數可能缺少的情況下(即是有3個或4個參數)

{=tokenstring\?(?:(param\d+)=(.+?)(?:&|(?:}$)))(?:(param\d+)=(.+?)(?:&|(?:}$)))(?:(param\d+)=(.+?)(?:&|(?:}$)))|(?:(param\d+)=(.+?)(?:&|(?:}$))) 

您會在匹配組中獲得匹配的參數,以便您可以檢測哪些參數丟失。參數的順序也無關緊要。

在正則表達式中還有一個if-then-else (?(?=condition)then|else)結構,但是如果你可以有1到4個參數,這意味着你必須編寫一個嵌套的三個級別的正則表達式,第一個檢查是否存在4個參數,另外一個參數存在3個參數等等,每個參數都重複捕捉一組瘋狂的數字。

+0

感謝您的回覆,但我正在尋找這種情況下的單一RegEx解決方案。這是因爲我無法在MySql級別使用此解決方案。如果我有單一的RegEX解決方案,那麼這將在PHP和MySql中起作用。 –

+0

很抱歉,您的RegEx不適合我。它使用示例引用字符串。 同樣對於>>您還需要在換行符處支持$匹配,沒有其他方法可以檢測符號是字符串的結尾還是參數的一部分。<<當前RegEx在這種情況下運行良好,但param3存在或不檢查是否存在。 –

+0

@AnkitShah是的,它沒有真正的工作,與匹配的組混淆。會給它多一點時間,但它看起來不太有希望 – buld0zzr

相關問題