Как мне преобразовать CamelCase в понятные человеку имена в Java?

Я могу видеть круг в firefox, делая 2 вещи:

1) Переименование файла из html в xhtml

2) Сменить скрипт на

<script type="text/javascript">
$(document).ready(function(){
    var obj = document.createElementNS("http://www.w3.org/2000/svg", "circle");
    obj.setAttributeNS(null, "cx", 100);
    obj.setAttributeNS(null, "cy", 50);
    obj.setAttributeNS(null, "r",  40);
    obj.setAttributeNS(null, "stroke", "black");
    obj.setAttributeNS(null, "stroke-width", 2);
    obj.setAttributeNS(null, "fill", "red");
    $("svg")[0].appendChild(obj);
});
</script>
145
задан Frederik 1 April 2010 в 10:42
поделиться

5 ответов

Это работает с вашими тесткейсами:

static String splitCamelCase(String s) {
   return s.replaceAll(
      String.format("%s|%s|%s",
         "(?<=[A-Z])(?=[A-Z][a-z])",
         "(?<=[^A-Z])(?=[A-Z])",
         "(?<=[A-Za-z])(?=[^A-Za-z])"
      ),
      " "
   );
}

Вот тестовый харнесс:

    String[] tests = {
        "lowercase",        // [lowercase]
        "Class",            // [Class]
        "MyClass",          // [My Class]
        "HTML",             // [HTML]
        "PDFLoader",        // [PDF Loader]
        "AString",          // [A String]
        "SimpleXMLParser",  // [Simple XML Parser]
        "GL11Version",      // [GL 11 Version]
        "99Bottles",        // [99 Bottles]
        "May5",             // [May 5]
        "BFG9000",          // [BFG 9000]
    };
    for (String test : tests) {
        System.out.println("[" + splitCamelCase(test) + "]");
    }

Он использует регекс с нулевой длиной и lookbehind и lookforward для поиска места вставки пробелов. В основном есть 3 шаблона, и я использую String.format, чтобы собрать их вместе, чтобы сделать их более читабельными.

Три паттерна:

UC за мной, UC с последующим LC передо мной

  XMLParser   AString    PDFLoader
    /\        /\           /\

non-UC за мной, UC передо мной

 MyClass   99Bottles
  /\        /\

Letter за мной, non-letter передо мной

 GL11    May5    BFG9000
  /\       /\      /\

Ссылки

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

Использование обходных путей с нулевой длиной для разбиения:

321
ответ дан 23 November 2019 в 22:27
поделиться

Следующее регулярное выражение может использоваться для определения заглавных букв внутри слов:

"((?<=[a-z0-9])[A-Z]|(?<=[a-zA-Z])[0-9]]|(?<=[A-Z])[A-Z](?=[a-z]))"

Соответствует каждой заглавной букве, то есть эфиру после не заглавной буквы или цифры или за которым следует строчная буква и каждая цифра после буквы.

Как вставить пробел перед ними, я не знаю Java =)

Отредактировано, чтобы включить регистр цифр и регистр PDF Loader.

1
ответ дан 23 November 2019 в 22:27
поделиться

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

1
ответ дан 23 November 2019 в 22:27
поделиться

http://code.google.com/p/inflection-js/

Вы можете связать String.underscore (). humanize () , чтобы взять строку CamelCase и преобразовать ее в удобочитаемую строку.

-3
ответ дан 23 November 2019 в 22:27
поделиться

Я не ниндзя в области regex, поэтому я бы перебирал строку, сохраняя индексы текущей проверяемой позиции и предыдущей позиции. Если текущая позиция - заглавная буква, я бы вставил пробел после предыдущей позиции и увеличил каждый индекс.

-1
ответ дан 23 November 2019 в 22:27
поделиться
Другие вопросы по тегам:

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