Как разбить строку CamelCase на ее подстроки в Ruby?

Вы можете найти мое решение по вашему вопросу отсюда: Панель инструментов Android + вкладка Layout + Drawer, Скрыть панель инструментов при прокрутке и взять TabLayout в начало

Это работающий solutio но это не лучший способ реализовать эту анимацию. С помощью CoordiantorLayout вы можете связать свои взгляды и прокручивать поведение.

Вы можете найти дополнительную информацию отсюда: https://developer.android.com/reference/android/support/design/ widget / CoordinatorLayout.html

Когда у меня будет время, я попытаюсь опубликовать пример кода для вас.

29
задан bastibe 22 October 2010 в 13:59
поделиться

7 ответов

s = 'nowIsTheTime'

s.split /(?=[A-Z])/

=> ["now", "Is", "The", "Time"]

?=pattern является примером позитивного взгляда. По сути, он соответствует точке в строке прямо перед шаблоном . Он не потребляет символы, то есть не включает шаблон как часть совпадения. Другой пример:

    irb> 'streets'.sub /t(?=s)/, '-'
=> "stree-s"

В этом случае s совпадает (только второй t совпадает), но не заменяется. Благодаря @Bryce и его regexp doc link. Брайс Андерсон добавляет объяснение:

?= в начале () группы совпадений называется позитивным прогнозом, , что является лишь способом сказать, что в то время как regex смотрит на символы, чтобы определить, совпадает ли он, но не делает их частью матча. split() обычно ест промежуточные символы, но в этом случае само совпадение пустое, поэтому там ничего нет.

55
ответ дан Community 22 October 2010 в 13:59
поделиться

Несмотря на то, что это вопрос о регулярном выражении в Ruby, и ответ от DigitalRoss является правильным и сияет своей простотой, я хочу добавить ответ на Java:

// this regex doesn't work perfect with Java and other regex engines
"NowIsTheTime".split("(?=[A-Z])"); // ["", "Now", "Is", "The", "Time"]

// this regex works with first uppercase or lowercase characters
"NowIsTheTime".split("(?!(^|[a-z]|$))"); // ["Now", "Is", "The", "Time"]
"nowIsTheTime".split("(?!(^|[a-z]|$))"); // ["now", "Is", "The", "Time"]
2
ответ дан Community 22 October 2010 в 13:59
поделиться

Ответ DigitalRoss является правильным, так как он обрабатывает общий случай, когда вы не знаете, строгий ли это регистр верблюдов (строчные буквы первого символа) или регистр Паскаля (прописные буквы первого регистра).

Если вы знаете, в какой из этих форм находится строка, или вы хотите навязать одну или другую, Inflector может это сделать.

Для случая Паскаля:

"NowIsTheTime".titleize

Для случая с верблюдом:

"nowIsTheTime".titleize.camelize :lower
8
ответ дан Tim Scott 22 October 2010 в 13:59
поделиться

Я знаю, что это старо, но стоит упомянуть о тех, кто может искать это. В рельсах вы можете сделать это: "NowIsTheTime".underscore.humanize

30
ответ дан John Conde 22 October 2010 в 13:59
поделиться

Вы пробовали

camelCaseString =~ /(Image)(Wide|Narrow)(Nice|Ugly)/

?

2
ответ дан pjmorse 22 October 2010 в 13:59
поделиться

Ответ от DigitalRoss не распознает аббревиатуры, встроенные в CamelCase. Например, он разделит «MyHTMLTricks» на «My H T M L Tricks» вместо «My HTML Tricks».

Вот еще одна опция, основанная на функции AsSpaced() в PmWiki , которая отлично справляется со своими задачами:

"MyHTMLTricks" \
.gsub(/([[:lower:]\\d])([[:upper:]])/, '\1 \2') \
.gsub(/([^-\\d])(\\d[-\\d]*( |$))/,'\1 \2') \
.gsub(/([[:upper:]])([[:upper:]][[:lower:]\\d])/, '\1 \2')

=> "My HTML Tricks"

Другая вещь, которая мне нравится При таком подходе строка остается строкой, а не превращается в массив. Если вам действительно нужен массив, просто добавьте разделение в конце.

"MyHTMLTricks" \
.gsub(/([[:lower:]\\d])([[:upper:]])/, '\1 \2') \
.gsub(/([^-\\d])(\\d[-\\d]*( |$))/,'\1 \2') \
.gsub(/([[:upper:]])([[:upper:]][[:lower:]\\d])/, '\1 \2') \
.split

=> ["My", "HTML", "Tricks"]

Для справки, вот оригинальный код PHP от PmWiki.

function AsSpaced($text) {
    $text = preg_replace("/([[:lower:]\\d])([[:upper:]])/", '$1 $2', $text);
    $text = preg_replace('/([^-\\d])(\\d[-\\d]*( |$))/', '$1 $2', $text);
    return preg_replace("/([[:upper:]])([[:upper:]][[:lower:]\\d])/", '$1 $2', $text);
}
1
ответ дан EFC 22 October 2010 в 13:59
поделиться
I/p:- "ImageWideNice".scan(/[A-Z][a-z]+/).join(",")

O/p:- "Image,Wide,Nice"
0
ответ дан Prashant Kajale 22 October 2010 в 13:59
поделиться
Другие вопросы по тегам:

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