Matcher.appendReplacement с буквенным текстом

Это такой простой алгоритм.

$max = -9999999; //will hold max val
$found_item = null; //will hold item with max val;

foreach($arr as $k=>$v)
{
    if($v['Total']>$max)
    {
       $max = $v['Total'];
       $found_item = $v;
    }
}

echo "max value is $max";
print_r($found_item);

Рабочая демонстрация

14
задан Jason S 3 June 2009 в 21:12
поделиться

3 ответа

Используйте Matcher.quoteReplacement в строке замены.

К сожалению, «простота использования» в этом случае конфликтует со строгой типизацией. [Объяснение: объект статического типа Java java.lang.String - это любая неизменяемая последовательность char s. Он не сообщает вам формат необработанных данных. В этом сценарии у нас есть текст, который, вероятно, имеет значение для пользователя, текст, закодированный на мини-языке для замены, и текст, закодированный на мини-языке для шаблона. В системе типов Java нет способа их различить (хотя вы можете делать забавные вещи с помощью средств проверки типов на основе аннотаций, часто во избежание уязвимостей XSS или SQL / инъекции команд). Для мини-языка шаблонов вы можете преобразовать его в форму Pattern. compile , хотя это специфическое использование, и большинство методов API игнорируют его (для простоты использования). Можно написать эквивалентный ReplacementText.compile . Кроме того, вы можете игнорировать мини-языки и использовать библиотеки как «DSL». Но все это не способствует случайной простоте использования.]

23
ответ дан 1 December 2019 в 07:06
поделиться

Другой вариант:

matcher.appendReplacement(stringbuffer, "");
stringbuffer.append(replacement);

appendReplacement () обрабатывает задание копирования текста между совпадениями, затем StringBuffer # append () добавляет вашу замену текст без фальсификации. Это особенно удобно, если вы генерируете замещающий текст динамически, как в Rewriter Эллиота Хьюза.

12
ответ дан 1 December 2019 в 07:06
поделиться

Я заставил его работать со следующим, но мне больше нравится решение Тома Хотина: -)

private static Pattern escapePattern = Pattern.compile("\\$|\\\\");
replacement = escapePattern.matcher(replacement).replaceAll("\\\\$0");
matcher.appendReplacement(stringbuffer, replacement);

Решение Тома:

matcher.appendReplacement(stringbuffer, Matcher.quoteReplacement(replacement));
4
ответ дан 1 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: