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