我有一些字符串,它们看起来像:
div#title.title.top
#main.main
a.bold#empty.red
它们与haml类似,我想通过正则表达式将它们拆分,但我不知道如何定义它。
val r = """???""".r // HELP
val items = "a.bold#empty.red".split(r)
items // -> "a", ".bold", "#empty", ".red"
怎么做?
更新
对不起,大家,但我需要更加努力地解决这个问题。
我很感兴趣val r = """(?<=\w)\b"""
但它无法解析更复杂的问题:
div#question-title.title-1.h-222_333
我希望它会被解析为:
div
#question-title
.title-1
.h-222_333
我想知道如何改善正则表达式?
答案 0 :(得分:8)
val r = """(?<=\w)\b(?!-)"""
请注意,分割需要String
表示正则表达式,而不是Regex
,因此您不得将r
从String
转换为Regex
。< / p>
正则表达式的简要说明:
(?<=...)
是一个后卫。它声明此匹配必须以模式...
开头,或者在您的情况下\w
,这意味着您希望模式遵循数字,字母或下划线。
\b
表示字边界。它是在单词字符(数字,字母和下划线)和非单词字符之间发生的零长度匹配,反之亦然。因为它是零长度,所以split
在拆分时不会删除任何字符。
(?!...)
是一个消极的向前看。在这里,我习惯说我对从字母到破折号的单词边界不感兴趣。
答案 1 :(得分:4)
从Josh M的回答开始,他有一个很好的正则表达式,但由于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 :(得分:2)
我不完全确定你需要什么,但这应该有所帮助:
(?:\.|#)?\w+
这意味着“术语”被定义为可选的点或散列,后跟一些单词字符。
你最终会得到:
div
#title
.title
.top
#main
.main
a
.bold
#empty
.red