簡體   English   中英

關於*的困惑? 正則表達式運算符

[英]Confusion regarding the *? regular expression operator

因此,我想使用以下正則表達式搜索字符串:

border-.*\.5pt

在邊框厚度為.5pt的文件中查找所有border-topborder-bottom等CSS屬性。 通常效果很好,但是太貪心了。

例如,以下所有內容都作為單個匹配項返回:

border-top:solid #1F497D .5pt;border-bottom:solid #1F497D .5pt

我希望這兩個CSS屬性是兩個單獨的匹配項。

所以我試圖將我的正則表達式修改為:

border-.*?\.5pt

使用? 使它不貪心。 但是,修改之后,沒有任何匹配項。

誰能解釋我為什么看到這種行為? 我想念什么?

(如果值得知道,我在進行此搜索時會使用Microsoft Expression Web的“使用正則表達式查找”。)

沒有一種“正則表達式”語言。 盡管存在廣泛的共性,但具體細節因實施而異。 許多正則表達式使用-為非貪心的“ 0或更多” ,其他正則表達式則使用*? 顯然, Microsoft Expression Web使用@

簡而言之,正則表達式可能會有所不同,因此您經常需要使用RTM來查找它的功能范圍和詳細的語法(例如,支持變更/回溯/等,分組字符,設置簡寫等)。 )

.*? 是最糟糕的,因此對正則表達式說“反模式”。 它通常用作“匹配某物直到字符串我要”模式,但事實並非如此。

特別是結合多個.*? 在一個模式中,可能會導致非常錯誤和意外的結果。

對於您的案例-如評論中所述-它有效。 (也許您做錯了什么?)

但是,在生成正則表達式模式時,更具體地總是一個好主意。 總是記着.*? 可以是任何東西。 還有你真的不想匹配的東西!

在您的示例中,我將使用類似以下內容: border-(?:[^:]+):\\s*(?:[^\\s]+)\\s+(?:\\#[a-fA-F0-9]{6})\\s+(?:\\d*(?:\\.\\d+)?)pt;?

更具體的,但給定的要求相匹配,忽略了不要讓SENCE所有空格,甚至匹配邊框寬度,如果regardles都寫為.234.1 如果從單個匹配組中刪除?: ,則還可以根據需要匹配每個單個屬性。 :位置,邊框類型,顏色和厚度。

模式border-([^:]+):\\s*([^\\s]+)\\s+(\\#[a-fA-F0-9]{6})\\s+(\\d*(?:\\.\\d+)?)pt;? 您的字符串border-top:solid #1F497D .5pt;border-bottom:solid #1F497D .5pt將匹配:

首場比賽:

1.top
2.solid
3.#1F497D
4..5

第二場比賽:

1.bottom
2.solid
3.#1F497D
4..5

暫無
暫無

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

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