В Python при форматировании строки я могу заполнять заполнители по имени, а не по позиции, например:
print "There's an incorrect value '%(value)s' in column # %(column)d" % \
{ 'value': x, 'column': y }
Интересно, возможно ли это в Java (надеюсь, без внешних библиотек)?
%s
была обычная практика. ru.wikipedia.org/wiki/Printf_format_string#History Также обратите внимание, что некоторые среды IDE и FindBugs могут автоматически обнаруживать несоответствие значений% s и% d, но я все равно предпочел бы именованные поля.Ответы:
StrSubstitutor из jakarta commons lang - это легкий способ сделать это, если ваши значения уже отформатированы правильно.
http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/text/StrSubstitutor.html
Вышеуказанные результаты в:
«В столбце № 2 неверное значение« 1 »»
При использовании Maven вы можете добавить эту зависимость в ваш pom.xml:
источник
${arg}
) вместо пользовательского выше (%(arg)
), то регулярное выражение не будет компилироваться, что является желаемым эффектом.не совсем, но вы можете использовать MessageFormat для ссылки на одно значение несколько раз:
Вышеприведенное также может быть сделано с помощью String.format (), но я нахожу очиститель синтаксиса messageFormat, если вам нужно создавать сложные выражения, плюс вам не нужно заботиться о типе объекта, который вы помещаете в строку
источник
MessageFormat
отличный, но громоздкий для относительно большого содержанияДругой пример Apache Common StringSubstitutor для простого именованного заполнителя.
источник
replaceIn
замену значений в буфер: StringBuilder или TextStringBuilder. При таком подходе все содержимое файла не будет загружено в память.Вы можете использовать библиотеку StringTemplate , она предлагает то, что вы хотите, и многое другое.
источник
'
unexpected char: '''
Для очень простых случаев вы можете просто использовать жестко замененную строку, нет необходимости в библиотеке:
ВНИМАНИЕ : я просто хотел показать самый простой код. Конечно, НЕ используйте это для серьезного производственного кода, где вопросы безопасности, как указано в комментариях: экранирование, обработка ошибок и безопасность, являются проблемой здесь. Но в худшем случае вы теперь знаете, почему использование «хорошей» библиотеки обязательно :-)
источник
Спасибо за вашу помощь! Используя все ваши подсказки, я написал рутину, чтобы делать именно то, что я хочу - Python-подобное форматирование строк с использованием словаря. Так как я новичок в Java, любые советы приветствуются.
источник
formatPos
не может содержатьformatKey
.Это старый поток, но просто для записи, вы также можете использовать стиль Java 8, например так:
Использование:
Выход будет:
источник
.reduce()
промежуточные результаты замещения рассматриваются как собственные строки форматирования, это решение уязвимо для атак форматной строки . Любое правильное решение должно сделать один проход через строку формата.Пример:
источник
.replaceAll()
обратных вызовов подстановки строк .Я автор небольшой библиотеки, которая делает именно то, что вы хотите:
Или вы можете связать аргументы:
источник
Метод replaceEach от Apache Commons Lang может пригодиться в зависимости от ваших конкретных потребностей. Вы можете легко использовать его для замены заполнителей по имени с помощью этого единственного вызова метода:
При наличии некоторого входного текста это заменит все вхождения заполнителей в первом строковом массиве соответствующими значениями во втором.
источник
Вы можете иметь что-то вроде этого в классе помощника строки
источник
Мой ответ:
а) используйте StringBuilder, когда это возможно
б) сохранить (в любой форме: целое число является лучшим, специальный символ, такой как макрос доллара и т. д.) в позиции «заполнителя», а затем использовать
StringBuilder.insert()
(несколько вариантов аргументов).Использование внешних библиотек кажется излишним, и я полагаю, что значительное снижение производительности происходит, когда StringBuilder внутренне преобразуется в String.
источник
На основании ответа я создал
MapBuilder
класс:Затем я создал класс
StringFormat
для форматирования строк:который вы могли бы использовать так:
источник
Я также создал класс util / helper (используя jdk 8), который может форматировать строку и заменять вхождения переменных.
Для этой цели я использовал метод "appendReplacement" Matchers, который выполняет все подстановки и зацикливает только затронутые части строки формата.
Вспомогательный класс в настоящее время недостаточно хорошо документирован. Я буду менять это в будущем;) В любом случае, я прокомментировал самые важные строки (я надеюсь).
Вы можете создать экземпляр класса для конкретной карты со значениями (или префиксом суффикса или noKeyFunction), например:
Более того, вы можете определить, что произойдет, если ключ в значениях Map отсутствует (работает в обоих случаях, например, неверное имя переменной в строке формата или отсутствующий ключ в Map). Поведение по умолчанию - это выброшенное непроверенное исключение (не проверено, потому что я использую функцию jdk8 по умолчанию, которая не может обрабатывать проверенные исключения), например:
Вы можете определить пользовательское поведение в вызове конструктора, например:
или верните значение по умолчанию без ключевого поведения:
Для лучшей обработки есть также статические представления методов, такие как:
источник
На момент написания этой статьи в Java ничего не встроено. Я бы предложил написать собственную реализацию. Я предпочитаю простой интерфейс беглого строителя вместо того, чтобы создавать карту и передавать ее в функцию - в итоге вы получите хороший непрерывный кусок кода, например:
Вот простая реализация:
источник
Попробуйте Freemarker , библиотеку шаблонов.
источник
https://dzone.com/articles/java-string-format-examples String.format (inputString, [listOfParams]) будет самым простым способом. Заполнители в строке могут быть определены по порядку. Для более подробной информации проверьте предоставленную ссылку.
источник
Вы должны взглянуть на официальную библиотеку ICU4J . Предоставляет MessageFormat класс аналогичный классу, доступному в JDK, но этот прежний поддерживает именованные заполнители.
В отличие от других решений, представленных на этой странице. ICU4j является частью проекта ICU который поддерживается IBM и регулярно обновляется. Кроме того, он поддерживает расширенные варианты использования, такие как множественное число и многое другое.
Вот пример кода:
источник
Существует Java-плагин для использования строковой интерполяции в Java (как в Kotlin, JavaScript). Поддержка Java 8, 9, 10, 11 ... https://github.com/antkorwin/better-strings
Использование переменных в строковых литералах:
Используя выражения:
Используя функции:
Для получения дополнительной информации, пожалуйста, прочитайте проект README.
источник