Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 正则表达式从CSS字体声明中提取字体系列列表_.net_Regex_Csv - Fatal编程技术网

.net 正则表达式从CSS字体声明中提取字体系列列表

.net 正则表达式从CSS字体声明中提取字体系列列表,.net,regex,csv,.net,Regex,Csv,我正在尝试创建一个.NET正则表达式来解析CSS字体声明,其形式如下: font: italic small-caps bold xx-small 3.0em "Times New Roman", Times, serif; 根据CSS规范,声明值的所有元素都是可选的,我已经成功地创建了与前五个元素匹配的正则表达式(以所有不同的允许形式),但是我在创建与字体名称列表匹配的正则表达式时遇到了困难,而字体名称列表始终是属性值中的最后一个元素。我不需要识别字体名称列表中的单个元素;我只想把清单作为一

我正在尝试创建一个.NET正则表达式来解析CSS字体声明,其形式如下:

font: italic small-caps bold xx-small 3.0em "Times New Roman", Times, serif;
根据CSS规范,声明值的所有元素都是可选的,我已经成功地创建了与前五个元素匹配的正则表达式(以所有不同的允许形式),但是我在创建与字体名称列表匹配的正则表达式时遇到了困难,而字体名称列表始终是属性值中的最后一个元素。我不需要识别字体名称列表中的单个元素;我只想把清单作为一个整体来匹配

字体名称列表是逗号分隔的列表(元素之间有可选的空格),列表中的每个成员要么是单个单词名称,要么是多个用引号括起来的单词

到目前为止,我已经想出了以下表达式

(?<NAME_LIST>(?<QUOTED_NAME>"[\w ]+")|(?<SIMPLE_NAME>\w+)(?:,\s*(?<QUOTED_NAME>"\w ]+")|(?<SIMPLE_NAME>\w+))*)
(?(?“[\w]+”)|(?\w+(:,\s*(?“\w]+”)|(?\w+)))*)
。。。但它单独匹配列表中的每个成员,而不是匹配整个列表

任何想法都将不胜感激

谢谢


Tim

可能是这样的(假设您在此位之前已经有了一些正则表达式来匹配字体列表之前的内容)

(?(?:['”]?(?:\w+\s*)+['](?:,\s*|\s*)+)
请注意,这也与结尾处的分号匹配,但可以使用字符串操作轻松删除

编辑:因为您只对声明的值部分求值,所以需要使用这个正则表达式,因为我注意到我的原始模式存在其他问题,所以它也有一些修复

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

谢谢您的回答。我接受了它,因为它肯定与字体名称的完整列表相匹配,这比我自己实现的还要多。然而,我有点误导了你。。。分号不存在于我的输入字符串中,因为我实际上只是在解析声明的值部分。我已经从您的模式中删除了分号,它仍然正确匹配。我可能会看到这种用法的副作用吗?再次感谢。@Tim:是的,它与后面的字体名称不匹配,我刚刚发现我的正则表达式有另一个我以前没有注意到的问题(如果没有引用第一个字体名称,则在开头匹配额外的内容),所以我现在正在修复它。好的,更新。(工作时不得不离开我的电脑一段时间。)感谢更新-它通过了我的49个单元测试,所以我想这是一个非常健壮的解决方案!再次感谢你的帮助。
(?<FONTS>(?:\s*(?:(?:['"](?:\w|\s)+["'])|\w+)\s*(?:,|$))+)