我需要改进我的 Powershell 正则表达式以找到特定 System.out.println 模式的 Java 代码

I need to improve my Powershell Regular Expression to find Java codes for specific System.out.println patterns

我们正在尝试扫描一个大型文件库,其中包含 html、xml 和 java 文件,这些文件都可以包含 Java 代码 System.out.println。问题是我需要找到那部分代码的一组特定示例。

示例 1: System.out.println("my job code is: " var.jobcode);

示例 2: System.out.println("my jc is: " var.jc);

示例 3: System.out.println("my jbc is: " var.jbc);

我尝试通过以下方式获得此信息:

Get-ChildItem C:\my\folder\path -Recurse | Where-Object FullName -Match ".*C:\my\folder\path*" | Where-Object FullName -Match ".*." | Select-String -Pattern '(System\.out\.println+(.*?job)\/?[^)]+[)]\s*;)|(System\.out\.println+(.*?jc)\/?[^)]+[)]\s*;)|(System\.out\.println+(.*?jbc)\/?[^)]+[)]\s*;){99}' -List | Select Path,Line

我得到了我想要的文件,但我也得到了误报,结果中包含以下行的文件是错误的。

System.out.println ("component printout: item"); System.out.println ("");                 <td style="word-break: break-all;word-wrap:break-word;font-size:12px;" class="FONTSTYLE" align="left">Job Codes</td><td style="word-break: break-all;word-wrap:break-word;font-size:12px;" class="FONTSTYLE" align="left">

所以只要文件有 System.out.println();部分后跟文件在不应该被拾取的任何单词“工作”。

我必须 运行 半定期地处理数千个文件,并且需要输出文件 path/name 并在有问题的代码所在的行中添加行。

如何清理此 Regex 以更具体地仅包含包含与我上面的示例类似的行的文件,而不选择其他文件?

关于您尝试的模式的一些注释:

  • 您有 3 个备选方案,唯一的区别是应该出现的单词。您可以对非捕获组中的这些词使用带有交替的单一模式
  • 使用 println+ 匹配 printl 后跟 1 次或多次 n 字符
  • 非贪心点.*?可能会过度匹配,因为点也可以匹配")
  • 量词 {99} 将整个分组部分重​​复了 99 次,最后一次交替似乎有点偏离模式。

您可以使模式更具体一些:

System\.out\.println\("[^":]*\s(?:job|jb?c)\s[^":]*:[^"]*"[^)]*\);

说明

  • System\.out\.println\( 匹配 System.out.println(
  • "[^":]* 匹配 " 然后是 ":
  • 以外的可选字符
  • \s(?:job|jb?c)\s 在空白字符之间匹配 job jbcjc(或使用单词边界 \b(?:job|jb?c)\b
  • [^":]*:[^"]*" 可选择匹配 ": 以外的任何字符,然后匹配 : 后跟 "
  • 以外的任何字符
  • [^)]*\); 匹配 ) 以外的可选字符,然后匹配 );

看到一个regex demo.

没有强制性 : 和字边界的替代方案:

System\.out\.println\("[^":]*\b(?:job|jb?c)\b[^"]*"[^)]*\);

再看一个regex demo