Интервал между последовательными символами в строке с помощью регулярного выражения Java - PullRequest
2 голосов
/ 03 апреля 2019

Я пытаюсь перевести строку и поставить подчеркивание перед любым заглавным символом. Ближайшее, что у меня есть, это:

out=in.replaceAll("([^_])([A-Z])","$1_$2");

но с "ABCDEF" он возвращает "A_BC_DE_F", я думаю, потому что после рассмотрения "AB", он не смотрит на "BC", потому что "B" уже был в предыдущем матче. Конечно, я мог бы применить его дважды, но есть ли более элегантное решение?

Также есть:

out=in.replaceAll("([A-Z])","_$1");

но к нему добавляется ведущий "_".

Java 1.8, если это имеет значение

Ответы [ 4 ]

4 голосов
/ 03 апреля 2019

Зачем использовать регулярное выражение ??

String underscoreUppercase(String target){
    StringBuilder b=new StringBuilder();
    boolean first=true;
    for(char c:target.toCharArray()){
        if(Character.isUpperCase(c) && !first){//to ommit leading underscore
             b.append('_');
         }
         first=false; 
        b.append(c);
    }

   return b.toString();   
}

для ABCDE это приведет к A_B_C_D_E

4 голосов
/ 03 апреля 2019

Вы можете поместить класс отрицательных символов [^_] в не потребляющий положительный взгляд назад

s = s.replaceAll("(?<=[^_])[A-Z]","_$0");

Обратите внимание, что нет необходимости заключать весь шаблон потребления в скобки с захватом, $0 обратная ссылка означает полное значение совпадения.

См. эту демонстрацию Java :

System.out.println(
      "ABCDEF".replaceAll("(?<=[^_])[A-Z]","_$0")
);  // => A_B_C_D_E_F
3 голосов
/ 03 апреля 2019

Вы можете использовать положительный прогноз здесь

Регулярное выражение: ([A-Z])(?=([A-Z])), где (?=([A-Z])) - не потребляющий позитивный взгляд

public static void main(String[] args) {
    String in = "ABCDEF";
    String out = in.replaceAll("([A-Z])(?=([A-Z]))", "$1_");
    System.out.println(out);

}
2 голосов
/ 03 апреля 2019

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

String in  = "ABCDEF";
String out = String.join("_", in.split("(?=\\p{Upper})"));
System.out.println(out);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...