好的伙计们,我的脑子被炸了。我试图通过替换错误的
来修复一些边界不好的EML--Boundary_([ArbitraryName])
更正确的行
--Boundary_([ArbitraryName])--
行,同时保留正确的
--Boundary_([ThisOneWasFine])--
单独行。我把整个消息作为字符串存储在内存中(是的,它很难看,但如果它试图解析这些,JavaMail会死掉),而我正在尝试对它进行替换。这是我能得到的最接近的。
//Identifie bondary lines that do not end in --
String regex = "^--Boundary_\\([^\\)]*\\)$";
Pattern pattern = Pattern.compile(regex,
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Matcher matcher = pattern.matcher(targetString);
//Store all of our unique results.
HashSet<String> boundaries = new HashSet<String>();
while (matcher.find())
boundaries.add(s);
//Add "--" at the end of the Strings we found.
for (String boundary : boundaries)
targetString = targetString.replaceAll(Pattern.quote(boundary),
boundary + "--");
这有明显的问题,即替换所有有效的
--Boundary_([WasValid])--
行
--Boundary_([WasValid])----
然而,这是我进行替换的唯一设置。如果我尝试将Pattern.quote(边界)更改为Pattern.quote(boundary)+“$”,则不会替换任何内容。如果我尝试使用matcher.replaceAll(“$ 0--”)而不是两个循环,则不会替换任何内容。什么是实现我的目标的优雅方式,为什么它的工作?
答案 0 :(得分:1)
无需使用find()
迭代匹配;这是replaceAll()
所做的一部分。
s = s.replaceAll("(?im)^--Boundary_\\([^\\)]*\\)$", "$0--");
替换字符串中的$0
是占位符,无论此迭代中的正则表达式是什么。
正则表达式开头的(?im)
打开CASE_INSENSITIVE和MULTILINE模式。
答案 1 :(得分:0)
您可以尝试这样的事情:
String regex = "^--Boundary_\\([^\\)]*\\)(--)?$";
然后查看字符串是否以--
结尾,并仅替换那些没有的字符串。
答案 2 :(得分:0)
假设所有字符串都在自己的行上,这有效:
的 "(?im)^--Boundary_\\([^)]*\\)$"
强>
示例脚本:
String str = "--Boundary_([ArbitraryName])\n--Boundary_([ArbitraryName])--\n--Boundary_([ArbitraryName])\n--Boundary_([ArbitraryName])--\n";
System.out.println(str.replaceAll("(?im)^--Boundary_\\([^)]*\\)$", "$0--"));
编辑:从JavaScript更改为Java,必须读得太快。(感谢您指出)