1. 程式人生 > >用正則表達式解決查找指定字符串前一位不能出現xxx,後一位不能出現xxx

用正則表達式解決查找指定字符串前一位不能出現xxx,後一位不能出現xxx

用法 深入學習 變量名 我們 包括 包含 針對 匹配 查找

之前項目要求做一個按指定字符串查找的工具,把所有該字段對應的數據信息都取出來。由於數據量大所以查詢結果要求精確匹配(說到這裏沒有什麽難度)。 但是還有一種符合條件的結果是該字段處於一條sql語句中,簡單的說,就是一個長得字符串裏包含了要查詢的字段,那麽要求來了。

1, 必須找出精確匹配要求的字符串的查詢結果,包括完全相同結果和長字符串中精確匹配的結果

2, 長字符串中的字符串有可能含有&xxx,或者&&xxx 也是符合條件的,因為他們實際指的是同一個字符串。

看起來很亂,舉個例子就能說明白了

比如,我要查詢的字符串是abc,在我查詢的數據裏有

1,abc 對應的數據信息, 滿足條件

2,xxx abc ....對應的數據, 滿足條件

3,xxx &abc ....對應的數據, 滿足條件

4,xxx &&abc....對應的數據, 滿足條件

5,xxx &&abc)....對應的數據, 滿足條件

6,xxx &&abc,....對應的數據, 滿足條件

7,xxx (&&abc....對應的數據, 滿足條件

8,xxx ,&&abc....對應的數據, 滿足條件

8,xxx , px.abc....對應的數據, 滿足條件

等等,總之就在長得字符串中,abc || &abc || &&abc 的前後不是字母、數字 或者下劃線, 不構成一個新的變量名,就可以認為滿足條件了

解決方案:

使用正則表達式來匹配篩選條件,普通的正則表達式已不能滿足要求,經過深入學習了正則表達式之後,發現了兩個正則表達式的用法:

1,零寬度正預測先行斷言

  語法:(?=exp)匹配exp表達式前面的位置。

在我的要求裏,abc前面一位不能是字母、數字、下劃線, 所以應該寫為\W(?=abc), 由於還要精確匹配 abc,所以修改為 \b\W?(?=abc)\b, 到現在還不能滿足要求。

2,零寬度負向預測先行斷言

  語法:(?!exp)匹配後面跟的不是exp的位置。

abc 後一位同樣也不能是字母、數字、下劃線,所以用此語法寫出來應該是\b(?!\w)\b

最後就是要實現查找一個字符串前後不能出現字母、數字、下劃線的一條正則表達式,將前面兩條組裝起來就是 \b\W?(?=abc)abc(?!\w)\b,雖然在測試時發現對於a&abc 這樣的數據不能過濾掉,但是在我們項目中的數據沒有這種類型的,所以完美匹配查詢結果。

針對這種指定字符串前不能出現xxx, 字符串後不能出現xxx的就可以用這種正則表達式來解決了,希望可以幫助更多的人解決同類的問題,不惜勿噴,謝謝!

此文為個人原創

用正則表達式解決查找指定字符串前一位不能出現xxx,後一位不能出現xxx