2010-07-08 27 views
0

我試圖創建一個.NET正則表達式來解析CSS字體聲明,這需要下面的表格中提取字體系列列表:正則表達式從CSS字體聲明

font: italic small-caps bold xx-small 3.0em "Times New Roman", Times, serif; 

根據CSS規範,所有聲明值的元素是可選的,並且我成功創建了與前五個元素匹配的Regexes(在他們所有不同的允許表單中),但是我無法創建一個匹配字體名稱列表的正則表達式,屬性值中的最後一個元素。我不需要識別字體名稱列表中的各個元素;我只是想匹配整個列表。

字體名稱列表是逗號分隔的列表(元素之間具有可選的空白),列表中的每個成員都是單引號名稱或用引號括起來的多個單詞。

到目前爲止,我想出了下面的表達式...

(?<NAME_LIST>(?<QUOTED_NAME>"[\w ]+")|(?<SIMPLE_NAME>\w+)(?:,\s*(?<QUOTED_NAME>"\w ]+")|(?<SIMPLE_NAME>\w+))*) 

...但它的列表中的每個成員單獨匹配,而不是匹配整個列表。

任何想法,將不勝感激。

感謝,

回答

1

也許這樣的事情(假設你已經在一些地方正則表達式此位之前的字體列表前的東西搭配)?

(?<FONTS>(?:['"]?(?:\w+\s*)+["']?(?:,\s*|\s*;))+) 

請注意,它與末尾的分號相匹配,但可以使用字符串操作輕鬆修剪。

編輯:既然你只評估聲明的價值的一部分,你會想這個表達式來代替,其中也有因爲我有我原來的模式發現其他問題的一些修正。

(?<FONTS>(?:\s*(?:(?:['"](?:\w|\s)+["'])|\w+)\s*(?:,|$))+) 
+0

感謝您的回答。我接受了它,因爲它確實匹配了字體名稱的完整列表,這比我自己實現的要多。然而,我誤導了你一點...分號不在我的輸入字符串中,因爲我實際上只是解析聲明的值部分。我已經從你的模式中刪除了分號,它仍然正確匹配。我可能會看到這種用法的任何副作用?再次感謝。 – 2010-07-08 15:46:49

+0

@Tim:是的,它不會匹配尾部字體的名字,我才發現我的正則表達式,我以前沒有注意到另一個問題(在開始處匹配多餘的東西,如果第一字體名稱沒有報價)所以我現在正在修復它。 – JAB 2010-07-08 17:41:19

+0

好,更新。 (不得不介入從我的電腦走了一下就可以工作時。) – JAB 2010-07-08 18:09:24