情境:
原先有一個字串的內容匹配,現在這個字串改成了另一種樣子。但是對於已經發版的用戶端還要支援舊版的字串匹配。
例:
舊字串: android/360 1.0
新字串: android/aaa/360/1.0
現在想寫一個Regex,既想能匹配舊字串,也想匹配新字串。
有沒有辦法根據某個條件成立,來選擇其中一種運算式?
舊錶達式匹配正則:
([iOS|android])\\scoco/([\\S\\s])\\s([\\S]*)
舊正則測試字串
android coco/360 1.0
新運算式匹配正則:
"([iOS|android])[\\s|\\S]coco/([\\S])/([\\S])/([\\S])/([0-9])";
新正則測試字串:
android coco/android_deviceId/360/1.0/123456
如何讓一個正則,既可以支援新的,也可以支援舊的?
([iOS|android]*)[\\s|\\S]coco/[([\\S\\s]*)\\s([\\S]*)] `**|**` [([\\S]*)/([\\S]*)/([\\S]*)/([0-9])]
類似於上面這個錯誤的正則思路。 該如何寫?
回複內容:
情境:
原先有一個字串的內容匹配,現在這個字串改成了另一種樣子。但是對於已經發版的用戶端還要支援舊版的字串匹配。
例:
舊字串: android/360 1.0
新字串: android/aaa/360/1.0
現在想寫一個Regex,既想能匹配舊字串,也想匹配新字串。
有沒有辦法根據某個條件成立,來選擇其中一種運算式?
舊錶達式匹配正則:
([iOS|android])\\scoco/([\\S\\s])\\s([\\S]*)
舊正則測試字串
android coco/360 1.0
新運算式匹配正則:
"([iOS|android])[\\s|\\S]coco/([\\S])/([\\S])/([\\S])/([0-9])";
新正則測試字串:
android coco/android_deviceId/360/1.0/123456
如何讓一個正則,既可以支援新的,也可以支援舊的?
([iOS|android]*)[\\s|\\S]coco/[([\\S\\s]*)\\s([\\S]*)] `**|**` [([\\S]*)/([\\S]*)/([\\S]*)/([0-9])]
類似於上面這個錯誤的正則思路。 該如何寫?
你這樣兩個字串差別已經很大了,就沒有必要壓縮到一個正則裡了,直接分成兩次正則判斷更為妥當。
正則裡沒有根據條件來選擇匹配規則的定義,像你這種情況用的還是 |
進行或匹配而已。其效果和使用兩次正則沒什麼區別。
最暴力的解決方案:用“或”(|
)
優雅一些的方案:提取兩個要匹配字串的公有特點,寫新的Regex相容