我需要改进我的 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
jbc
或 jc
(或使用单词边界 \b(?:job|jb?c)\b
)
[^":]*:[^"]*"
可选择匹配 "
和 :
以外的任何字符,然后匹配 :
后跟 "
以外的任何字符
[^)]*\);
匹配 )
以外的可选字符,然后匹配 )
和 ;
看到一个regex demo.
没有强制性 :
和字边界的替代方案:
System\.out\.println\("[^":]*\b(?:job|jb?c)\b[^"]*"[^)]*\);
再看一个regex demo。
我们正在尝试扫描一个大型文件库,其中包含 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
jbc
或jc
(或使用单词边界\b(?:job|jb?c)\b
)[^":]*:[^"]*"
可选择匹配"
和:
以外的任何字符,然后匹配:
后跟"
以外的任何字符
[^)]*\);
匹配)
以外的可选字符,然后匹配)
和;
看到一个regex demo.
没有强制性 :
和字边界的替代方案:
System\.out\.println\("[^":]*\b(?:job|jb?c)\b[^"]*"[^)]*\);
再看一个regex demo。