Как разделить эту строку по регулярному выражению? - PullRequest
7 голосов
/ 13 марта 2011

У меня есть строка, она выглядит так:

div#title.title.top
#main.main
a.bold#empty.red

Они похожи на хамл, и я хочу разделить их по регулярному выражению, но я не знаю, как это определить.

val r = """???""".r // HELP
val items = "a.bold#empty.red".split(r)
items // -> "a", ".bold", "#empty", ".red"

Как это сделать?


UPDATE

Извините всех, но мне нужно усложнить этот вопрос. Я очень заинтересован в

val r = """(?<=\w)\b"""

Но он не смог разобрать более сложные:

div#question-title.title-1.h-222_333

Я надеюсь, что он будет проанализирован:

div
#question-title
.title-1
.h-222_333 

Я хочу знать, как улучшить это регулярное выражение?

Ответы [ 3 ]

8 голосов
/ 13 марта 2011
val r = """(?<=\w)\b(?!-)"""

Обратите внимание, что split принимает String, представляющее регулярное выражение, а не Regex, поэтому вы не должны преобразовывать r из String в Regex.

Краткое объяснение регулярного выражения:

  • (?<=...) - это взгляд назад. В нем говорится, что этому совпадению должен предшествовать шаблон ... или, в вашем случае \w, что означает, что вы хотите, чтобы шаблон следовал за цифрой, буквой или подчеркиванием.

  • \b означает границу слова. Это совпадение нулевой длины, которое происходит между символом слова (цифрами, буквами и подчеркиванием) и несловесным символом, или наоборот. Поскольку это нулевая длина, split не удалит ни один символ при разбиении.

  • (?!...) отрицательно. Здесь я использую, чтобы сказать, что меня не интересуют границы слов от буквы до тире.

4 голосов
/ 13 марта 2011

Начиная с ответа Джоша М, у него хорошее регулярное выражение, но поскольку split принимает регулярное выражение, соответствующее «разделителю», вам необходимо использовать findAllIn следующим образом:

val r = """(?:\.|#)?\w+""".r
val items = r findAllIn "a.bold#empty.red"
    //maybe you want a toList on the end also

Тогда вы получите результаты

div#title.title.top    -> List(div, #title, .title, .top)
#main.main             -> List(#main, .main)
a.bold#empty.red       -> List(a, .bold, #empty, .red)
2 голосов
/ 13 марта 2011

Я не совсем уверен, что вам нужно здесь, но это должно помочь:

(?:\.|#)?\w+

Это означает, что «термин» определяется как необязательная точка или хеш, за которыми следуют некоторые символы слова.

В итоге вы получите:

div
#title
.title
.top
#main
.main
a
.bold
#empty
.red
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...