【发布时间】:2020-03-11 18:37:41
【问题描述】:
我有一个奇怪的情况,我觉得正则表达式匹配器很难理解。
当我将下一个输入参数 issueBody 传递给匹配器时,matcher.find() 总是返回 false,同时传递与 issueBody - 它按预期工作。
正则表达式函数:
private Map<String, String> extractCodeSnippet(Set<String> resolvedIssueCodeLines, String issueBody) {
String codeSnippetForCodeLinePattern = "\\(Line #%s\\).*\\W\\`{3}\\W+(.*)(?=\\W+\\`{3})";
Map<String, String> resolvedIssuesMap = new HashMap<>();
for (String currentResolvedIssue : resolvedIssueCodeLines) {
String currentCodeLinePattern = String.format(codeSnippetForCodeLinePattern, currentResolvedIssue);
Pattern pattern = Pattern.compile(currentCodeLinePattern, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(issueBody);
while (matcher.find()) {
resolvedIssuesMap.put(currentResolvedIssue, matcher.group());
}
}
return resolvedIssuesMap;
}
以下总是返回 false
Pattern pattern = Pattern.compile(currentCodeLinePattern, Pattern.MULTILINE);
Matcher matcher = pattern.matcher(issueBody);
虽然以下总是返回 true
Pattern pattern = Pattern.compile(currentCodeLinePattern, Pattern.MULTILINE);
Matcher matcher = pattern.matcher("**SQL_Injection** issue exists @ **VB_3845_112_lines/encode.frm** in branch **master**\n" +
"\n" +
"Severity: High\n" +
"\n" +
"CWE:89\n" +
"\n" +
"[Vulnerability details and guidance](https://cwe.mitre.org/data/definitions/89.html)\n" +
"\n" +
"[Internal Guidance](https://checkmarx.atlassian.net/wiki/spaces/AS/pages/79462432/Remediation+Guidance)\n" +
"\n" +
"[ppttx](http://WIN2K12-TEMP/bbcl/ViewerMain.aspx?planid=1010013&projectid=10005&pathid=1)\n" +
"\n" +
"Lines: 41 42 \n" +
"\n" +
"---\n" +
"[Code (Line #41):](null#L41)\n" +
"```\n" +
" user_name = txtUserName.Text\n" +
"```\n" +
"---\n" +
"[Code (Line #42):](null#L42)\n" +
"```\n" +
" password = txtPassword.Text\n" +
"```\n" +
"---\n");
我的问题是 - 为什么?这两种说法有什么区别?
【问题讨论】:
-
您还可以显示分配 issueBody 字符串的位置/方式吗?也许有什么问题。
-
我的第一个猜测是 issueBody 是使用错误字符集从字节流创建的。
-
@Andreas - 你是对的。它们是不相同的。为什么会这样?需要做什么?
-
嗯,还有
Pattern pattern = Pattern.compile(currentCodeLinePattern, Pattern.UNIX_LINES);?注意Pattern.MULTILINE不是必需的,因为您的模式既没有^也没有$。 -
@WiktorStribiżew - 成功了!我想我永远不会有
Pattern.MULTILINE是问题...谢谢!