我們正在嘗試掃描包含 html、xml 和 java 檔案的大型檔案庫,這些檔案都可以包含 System.out.println 的 Java 代碼。問題是我需要找到這部分代碼的一組特定示例。
示例 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(); 部分后跟任何單詞“job”,該檔案在不應該被拾取時也被拾取。
我必須在半定期的基礎上運行數千個檔案,并且需要輸出檔案路徑/名稱和違規代碼所在的行。
如何清理此正則運算式以更具體地僅包含具有上述示例行的檔案,但不包含其他檔案?
uj5u.com熱心網友回復:
關于您嘗試的模式的一些說明:
- 您有 3 個交替,唯一的區別是應該出現的單詞。您可以對非捕獲組中的這些單詞使用帶有交替的單個模式
- 使用
printlnmatchprintl后跟 1 次或多次nchar - 非貪心點
.*?可能會過度匹配,因為點也可以匹配"并且) - 量詞
{99}將整個分組部分準確地重復 99 次,最后一個交替似乎在模式中有點偏離。
您可以使模式更具體一點:
System\.out\.println\("[^":]*\s(?:job|jb?c)\s[^":]*:[^"]*"[^)]*\);
解釋
System\.out\.println\(匹配System.out.println("[^":]*匹配",然后是可選字符,而不是"and:\s(?:job|jb?c)\s匹配空白字符jobjbc或jc在空白字符之間匹配(或使用單詞邊界\b(?:job|jb?c)\b)[^":]*:[^"]*"可以選擇匹配除"and之外的任何字符:,然后匹配:后跟任何字符,除了"[^)]*\);匹配除 之外的可選字符),然后匹配)和;
查看正則運算式演示。
:沒有強制性和單詞邊界的替代方案:
System\.out\.println\("[^":]*\b(?:job|jb?c)\b[^"]*"[^)]*\);
查看另一個正則運算式演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/485456.html
