簡體   English   中英

使用or運算符在兩個字符串之間進行正則表達式匹配

[英]Regex Match Between Two Strings With Or Operator

我試圖尋找解決方案來解決這個問題,但只發現了在兩個字符串之間進行搜索的一般問題。

本質上,我正在嘗試查找任何未用於在SQL腳本中創建表的SELECT語句。

我目前在Sublime Text 3中使用此正則表達式: ;(\\h|\\v|/\\*(?s).+?\\*/)+((SELECT|SEL)(?s).+?;)

關鍵是要找到在“;”之后出現的SELECT語句。 可以有垂直空格,水平空格或兩者之間的注釋塊。

當要在注釋塊之間插入內容時,這將無法正常工作。 例如

;
/*Comment Block*/
CREATE TABLE table AS SELECT * FROM other_table1 AS a INNER JOIN (
/*Comment Block*/
SELECT *
FROM other_table2
) AS b
ON a.key = b.key
;

之所以會匹配,是因為從技術上講CREATE TABLE在/ *和* /之間。 我嘗試將匹配設置為非貪婪,如果僅使用正則表達式/\\*(?s).+?\\*/則可以/\\*(?s).+?\\*/ 一次只能選擇一個注釋塊,但是與OR運算符“ |”一起使用時 (很抱歉,如果從技術上來說,這不是一個“或”運算符),這似乎很貪心。

關於如何解決此問題的任何想法?

(s).+?/\\*延遲匹配所有字符,包括換行符,直到找到/* 一旦正則表達式引擎找到第一個注釋塊的末尾,它將繼續與SELECT匹配,但不能匹配。 由於這是一個惰性搜索,因此如果找到SELECT ,它將放棄任何進一步的搜索,但是它沒有回溯並繼續 然后,找到第二個注釋塊的末尾,之后便可以找到SELECT

對正則表達式展覽品的根本誤解是在需要非回溯匹配的情況下使用了惰性匹配。 懶惰並不意味着不會發生回溯。 惰性意味着不會發生不必要的回溯。

避免回溯的方法是使用原子組,例如(?>example atomic group) 您的正則表達式將變為:

;(?>\\h|\\v|/\\*(?s).+?\\*/)+((SELECT|SEL)(?s).+?;)

看到這個動作

避免此問題的另一種方法是避免搜索注釋塊中的所有字符。 實現此目的的方法(顯然)是在注釋塊中匹配所有不以*開頭,后跟/字符。 轉換為([^*]|\\*(?=/))+ 您的正則表達式將變為:

;(\\h|\\v|/\\*([^*]|\\*(?=/))+\\*/)+((SELECT|SEL)(?s).+?;)

看到這個動作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM