Java - Преобразование символа строки в верхний регистр с использованием RegEx - PullRequest
1 голос
/ 23 января 2020

Мне нужно преобразовать символы, за которыми следует - в строке, в верхний регистр.

Используя Regex101, следующее работает как шарм:

Regex -> (\-[a-z]|\_[a-z])
Substitution -> \U$1

Regex101

Но я не знаю, как правильно перевести это в Java RegEx. Вот что я получил до сих пор:

StringBuilder str = new StringBuilder("this-is-a_test");
Pattern p = Pattern.compile("(\\-[a-z]|\\_[a-z])");
p.matcher(str).replaceAll("\\p{Lu}$1");

System.out.println(str);

Что именно я делаю не так?

1 Ответ

3 голосов
/ 23 января 2020
  1. public String replaceAll​(String replacement) не изменяет исходный текст , используемый Matcher, но возвращает новую (отдельную) строку с заменой содержание основано на оригинальном тексте, переданном на соответствие Таким образом, p.matcher(str).replaceAll("\\p{Lu}$1"); не изменит str, но вернет новую строку, которую вы игнорируете.

  2. Также .replaceAll("\\p{Lu}$1") не рассматривает \\p{Lu} как индикатор изменения в верхнем регистре, как \U в JavaScript. Механизм регулярных выражений Java - это другой зверь, и \\p{Lu} при замене обрабатывается как простая строка без особого значения, поэтому ваш код приведет к thisp{Lu}-isp{Lu}-ap{Lu}_test.

Если вы хотите легко генерировать динамические c замены на основе текущего соответствия , вы можете использовать public String replaceAll​(Function<MatchResult,​String> replacer), добавленные в Java 9. Таким образом, вы можете обеспечить реализацию функционального интерфейса Function<MatchResult,​String> с лямбда-подобием match -> /*code using match and returning proper replacement*/

В вашем случае это может выглядеть так:

StringBuilder str = new StringBuilder("this-is-a_test");
Pattern p = Pattern.compile("[-_][a-z]");
String replaced = p.matcher(str).replaceAll(match -> match.group(0).toUpperCase());
System.out.println(replaced);

, что приводит к this-Is-A_Test.

Кстати, я упростил ваше регулярное выражение до [-_][a-z] так как ИМО легче понять.

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