Regex 匹配变量=值但忽略尾随空格和注释的正则表达式
我试图解析一个驱动程序inf文件,并从节中提取“变量”和“值”。 我提出了一个基本的正则表达式:Regex 匹配变量=值但忽略尾随空格和注释的正则表达式,regex,Regex,我试图解析一个驱动程序inf文件,并从节中提取“变量”和“值”。 我提出了一个基本的正则表达式: "(.+?)\s*=\s*(.+)" 这匹配变量fine,但它匹配等于和空格后的所有内容。在这些文件中,可能会有以分号开头的尾随注释,我不希望它们匹配。我想我应该试试: "(.+?)\s*=\s*(.+);?" 但它不起作用。另一个问题是分号前可能有空格,我也想忽略它,但我想匹配的值中可能有空格。以下是一些示例(使用变量作为第一个匹配项,使用值作为第二个匹配项): Class=显示(变量应为“C
"(.+?)\s*=\s*(.+)"
这匹配变量fine,但它匹配等于和空格后的所有内容。在这些文件中,可能会有以分号开头的尾随注释,我不希望它们匹配。我想我应该试试:
"(.+?)\s*=\s*(.+);?"
但它不起作用。另一个问题是分号前可能有空格,我也想忽略它,但我想匹配的值中可能有空格。以下是一些示例(使用变量作为第一个匹配项,使用值作为第二个匹配项):
Class=显示(变量应为“Class”,值为“Display”
DefaultDestDir=11;system32(variable=“DefaultDestDir”和value=“11”)
cpuxyz=16483,au-zy-xy-open;注释(variable=“cpuxyz”和value=“16483,au-zy-xy-open”)
我希望扩展我的初始正则表达式,以便“value”可以处理上述所有示例。下面的正则表达式将变量及其对应的值划分为组
(.+?)\s*=\s*(.+?)\s*;
说明:
匹配并捕获从行首到(.+?)\s*
字符的一个或多个字符。(\s
使正则表达式引擎尽可能匹配)?
文字符号=
零个或多个空格\s*
匹配并捕获从行首到(.+?)\s*
字符的一个或多个字符\s
字面分号;
- 负面角色类是你的朋友
你真幸运,我今天口袋里有一些
^([^=\s]+)[ ]*=[ ]*([^;\r\n]+)
在中,查看右侧窗格中的捕获组
解释
锚定声明我们位于字符串的开头^
- 在第一个
,负字符类(捕获组)
匹配一个或多个非[^=\s]+
字符或空白字符(包括换行符)=
匹配可选空格。括号不需要,它们是为了清晰起见[]*
匹配文本=
=
匹配可选空格[]*
- 在第二个
,负字符类(捕获组)
匹配一个或多个非[^;\r\n]+
或换行字符;
(.+?)\s*=\s*([^;\n]+)\s
@zx81对不起,我的笔记本电脑要关机了。我会在7小时后收到你的。这不是我想聊的,但在这种模式下,一个问题(我看到的)是,使用这个字符串“我的长变量=显示”,“变量将是我的长变量”(前面有无限的空格)。没关系。没有变量有空格,只有值。@Lembarts我刚刚意识到final\s*;不会删除值中的空格,只有在结尾有分号的空格。如果有一行结尾没有分号注释怎么办?您能做吗?*@M42谢谢M42!:)@m42-这是一个很好的方法,可以帮助我更好地使用正则表达式。唯一剩下的是值末尾的尾随空格,但我可以使用编程“trim”函数来消除这些空格,而不是使regexp复杂化。非常欢迎,很高兴它有所帮助。您可以通过在末尾添加一个负的lookback来删除最后的空格,以声明前面的字符不是空格:^([^=\s]+)[]*=[]*([^;\r\n]+)(?请看@zx81-您能用英语解释最后一组括号在做什么吗?我知道最后一组括号是这样说的“匹配等号后面的第一个字符和非分号的可选空格或返回,直到”(?反向查找断言紧跟其后的不是空格字符。空格是关闭括号之前的最后一个字符。强制[^;\r\n]+
如果它有匹配的尾随空格(它可以),则返回。我们无法在[^;\r\n]+
中添加空格,因为我们希望他能够匹配AB
请参见