Java替换所有正则表达式具有相似的结果

时间:2012-02-15 01:28:41

标签: java regex string replaceall

好的伙计们,我的脑子被炸了。我试图通过替换错误的

来修复一些边界不好的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--”)而不是两个循环,则不会替换任何内容。什么是实现我的目标的优雅方式,为什么它的工作?

3 个答案:

答案 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,必须读得太快。(感谢您指出)