如何用正则表达式拆分这个字符串?

时间:2011-03-13 01:50:37

标签: regex scala split

我有一些字符串,它们看起来像:

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 

我想知道如何改善正则表达式?

3 个答案:

答案 0 :(得分:8)

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

请注意,分割需要String表示正则表达式,而不是Regex,因此您不得将rString转换为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