我正在尝试解析驱动程序inf文件并提取"变量"和"价值观"从部分。 我想出了一个基本的正则表达式:
"(.+?)\s*=\s*(.+)"
这匹配变量fine,但它匹配equals和whitespace之后的所有内容。在这些文件中,可以选择以分号开头的尾随注释,我不希望这些注释匹配。我想我会尝试:
"(.+?)\s*=\s*(.+);?"
但它不起作用。另一个问题是分号前可能有空格,我也想忽略但是我想要匹配的值中可能有空格。以下是一些示例(使用变量作为第一个匹配,将值作为第二个匹配):
Class = Display(变量应为" Class"值为" Display"
DefaultDestDir = 11; system32(变量=" DefaultDestDir"和值=" 11")
cpuxyz = 16483,au zy xy open;评论(变量=" cpuxyz"和值=" 16483,au zy xy open")
我希望扩展我的初始正则表达式,以便"值"可以应付所有上述例子。
答案 0 :(得分:2)
负面角色类是您的朋友
幸运的是,今天我口袋里有一些东西。
^([^=\s]+)[ ]*=[ ]*([^;\r\n]+)
在the demo中,查看右侧窗格中的捕获组。
<强>解释强>
^
锚点断言我们位于字符串的开头(capture group)
中,否定字符类[^=\s]+
匹配一个或多个不是=
的字符或一个空白字符(包括换行符)[ ]*
匹配可选空格。不需要括号,为了清楚起见,它们就在那里=
与文字=
[ ]*
匹配可选空格。 (capture group)
中,否定字符类[^;\r\n]+
匹配一个或多个不是;
或换行符字符的字符答案 1 :(得分:0)
下面的正则表达式会将变量和相应的值组合成组,
(.+?)\s*=\s*(.+?)\s*;
<强>解释强>
(.+?)\s*
匹配并捕获从行首到\s
字符的一个或多个字符。(?
使正则表达式引擎匹配最短的可能性)=
文字=
符号\s*
零个或多个空格。(.+?)\s*
匹配并捕获从行首到\s
字符的一个或多个字符。;
字面分号。