Java заменяет все регулярные выражения с похожим результатом - PullRequest
1 голос
/ 15 февраля 2012

Хорошо, ребята, мой мозг жарен.Я пытаюсь исправить некоторые 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 (border) на Pattern.quote (border) + "$", ничего не будет заменено.Если я попытаюсь использовать matcher.replaceAll ("$ 0--") вместо двух циклов, ничего не заменится.Какой элегантный способ достичь моей цели и почему он работает?

Ответы [ 3 ]

1 голос
/ 15 февраля 2012

Нет необходимости перебирать совпадения с find(); это часть того, что делает replaceAll().

s = s.replaceAll("(?im)^--Boundary_\\([^\\)]*\\)$", "$0--");

$0 в строке замены является заполнителем независимо от совпадения регулярного выражения в этой итерации.

(?im) в начале регулярного выражения включает режимы CASE_INSENSITIVE и MULTILINE.

0 голосов
/ 15 февраля 2012

Предполагая, что все строки находятся в собственной строке, это работает: "(?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, должно быть, читал слишком быстро. (Спасибо за указание на это)

0 голосов
/ 15 февраля 2012

Вы можете попробовать что-то вроде этого:

String regex = "^--Boundary_\\([^\\)]*\\)(--)?$";

, затем посмотрите, заканчивается ли строка на --, и замените только те, которые этого не делают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...