Используйте регулярное выражение для отмены CamelCase Java String - PullRequest
0 голосов
/ 28 ноября 2018

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

 public static void main(String args[]) {
    String s = "IAmASentenceInCamelCaseWithNumbers500And1And37";
    System.out.println(unCamelCase(s));
}

public static String unCamelCase(String string) {
    StringBuilder newString = new StringBuilder(string.length() * 2);
    newString.append(string.charAt(0));
    for (int i = 1; i < string.length(); i++) {
        if (Character.isUpperCase(string.charAt(i)) && string.charAt(i - 1) != ' '
            || Character.isDigit(string.charAt(i)) && !Character.isDigit(string.charAt(i - 1))) {
            newString.append(' ');
        }
        newString.append(string.charAt(i));
    }
    return newString.toString();
}

Ввод:

IAmASentenceInCamelCaseWithNumbers500And1And37

Вывод:

I Am A Sentence In Camel Case With Numbers 500 And 1 And 37

Я не фанат использования этого уродливого оператора if, и я надеюсь, что есть способ использовать одну строку кода с использованием регулярных выражений.Я попытался немного, но он потерпел неудачу на словах с 1 или 2 буквами.

Сбой кода, который не работает:

return string.replaceAll("(.)([A-Z0-9]\\w)", "$1 $2");

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Правильное выражение и код для выполнения вашей работы:

String s = "IAmASentenceInCamelCaseWithNumbers500And1And37";
System.out.println("Output: " + s.replaceAll("[A-Z]|\\d+", " $0").trim());

Это выводит,

Output: I Am A Sentence In Camel Case With Numbers 500 And 1 And 37

Редактирование ответа на запрос, заданный OP в комментарии:

Если входная строка равна,

ThisIsAnABBRFor1Abbreviation

Regex нуждается в небольшой модификации и становится этим, [A-Z]+(?![a-z])|[A-Z]|\\d+ для обработки сокращений.

Этот код,

String s = "ThisIsAnABBRFor1Abbreviation";
System.out.println("Input: " + s.replaceAll("[A-Z]+(?![a-z])|[A-Z]|\\d+", " $0").trim());

Дает ожидаемый результат согласно OP ZeekAran в комментарии,

Input: This Is An ABBR For 1 Abbreviation
0 голосов
/ 28 ноября 2018

Вы можете использовать это регулярное решение для регулярных выражений:

final String result = string.replaceAll(
   "(?<=\\S)(?=[A-Z])|(?<=[^\\s\\d])(?=\\d)", " ");

//=> I Am A Sentence In Camel Case With Numbers 500 And 1 And 37

Демонстрация RegEx

Подробности RegEx:

Регулярное выражение соответствует одному из двух условий и заменяет его пробелом.Он будет игнорировать уже имеющиеся пробелы во входных данных.

  • (?<=\\S)(?=[A-Z]): предыдущий символ не является пробелом, а следующий символ является заглавной буквой
  • |: ИЛИ
  • (?<=[^\\s\\d])(?=\\d): предыдущий символ не является цифрой и не является пробелом, а следующий - цифрой
0 голосов
/ 28 ноября 2018

Я думаю, вы можете попробовать это

let str = "IAmASentenceInCamelCaseWithNumbers500And1And37";

function unCamelCase(str){
  return str.replace(/(?:[A-Z]|[0-9]+)/g, (m)=>' '+m.toUpperCase()).trim();
}

console.log(unCamelCase(str));

Пояснение

(?:[A-Z]|[0-9]+)

?: - группа без захвата.

[A-Z] - совпадениялюбой заглавный символ.

'|'- Чередование (работает так же, как логическое ИЛИ).

[0-9]+ - Соответствует любой цифре от 0-9 один или несколько раз.

PS Извините за примерв JavaScript, но ту же логику можно легко реализовать в JAVA.

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