使用正则表达式找不到字符串

时间:2018-10-16 21:20:23

标签: regex powershell

我在文件中有以下文本。

BEGIN
   BLOCK "StringFileInfo"
   BEGIN
       BEGIN
           VALUE "CompanyName", "MyCompany"
           VALUE "FileDescription", "MyFile"
           VALUE "FileVersion", "1.0.0.0"
           VALUE "InternalName", "Something.exe"
           VALUE "LegalCopyright", "MyCopyright "
           VALUE "OriginalFilename", "Something.exe"
           VALUE "ProductName", "MyProduct"
           VALUE "ProductVersion", "1.0.0.0"
       END
   END
END

我需要用其他一些字符串将FileVersion替换为该行。要找到该行,我正在使用以下正则表达式,但找不到它。

"(^\s*VALUE\s*`"FileVersion`",\s*)`"[0-9]+,\s*[0-9]+,\s*[0-9]+,\s*[0-9]+`"$"

有什么主意在这里吗?

PS:不确定是否重要,但是在here中发布了我要使用的完整脚本。

2 个答案:

答案 0 :(得分:1)

如Wiktor所述,您需要在RegEx中用逗号替换逗号。这应该起作用:

"(^\s*VALUE\s*`"FileVersion`",\s*)`"[0-9]+\.\s*[0-9]+\.\s*[0-9]+\.\s*[0-9]+`"$"

或者为了简化脚本的整个部分(使用后视和前瞻,以及将FileVersion和ProductVersion匹配组合为一个匹配的选项组),这也应该工作:

(Get-Content $file) -replace '(?<=^\s*"(FileVersion|ProductVersion)",\s*")\d+\.\d+\.\d+\.\d+(?=")', $rc_version -replace '(?<=^\s*VALUE\s*"(FileVersion|ProductVersion)",\s*")\d+\.\d+\.\d+\.\d+(?=")', $rc_version_spaced | Set-Content $file

答案 1 :(得分:1)

script 在到达正则表达式之前先对目标进行一些替换。

要匹配“版本”行,请使用类似以下内容:

(?mi)^[ \t]*value[ \t]+"fileversion"[ \t]*,[ \t]*"([0-9]+(?:\.[0-9]+)*)"[ \t]*$

https://regex101.com/r/a8cJ4n/1

更多信息

 (?mi)                              # Inline modifiers; multi-line, case insensitive
 ^                                  # BOL
 [ \t]* value [ \t]+                # VALUE
 "fileversion" [ \t]* , [ \t]*      # FILEVERSION
 " 
 (                                  # (1 start), Version numbers
      [0-9]+ 
      (?: \. [0-9]+ )*
 )                                  # (1 end)
 "
 [ \t]* 
 $                                  # EOL