2011-03-13 91 views
6

我有一些字符串,它们看起来像:如何用正则表达式分割这个字符串?

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" 

如何做到这一点?


UPDATE

对不起,每个人,但我需要使这个问题更难。我在

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

很感兴趣,但它没能解析更复杂的:

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

我希望它会被解析成:

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

我想知道如何改进那个正则表达式?

+1

那么,你希望解析什么?你没有真正解释你的期望。 –

回答

2

我不能完全确定什么您这里需要但这应该帮助:

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

这意味着一个“术语”的定义是一个可选点或散列其次是一些单词字符。

您将结束:

div 
#title 
.title 
.top 
#main 
.main 
a 
.bold 
#empty 
.red 
8
val r = """(?<=\w)\b(?!-)""" 

注意分裂接受表示正则表达式,而不是一个RegexString,所以你不能从String转换rRegex。在正则表达式

简要说明:

  • (?<=...)是向后看。它指出,此匹配必须以...的模式开头,或者在您的案例中为\w,这意味着您希望模式遵循数字,字母或下划线。

  • \b表示字边界。在单词字符(数字,字母和下划线)与非单词字符之间发生零长度匹配,反之亦然。因为它是零长度,所以split在分割时不会删除任何字符。

  • (?!...)是一种负面看法。在这里,我用来说,我对从字母到短划线的单词界限不感兴趣。

3

与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) 
+0

是的,我没有\不知道有关功能的具体细节。 –

+0

非常感谢。但是因为@Josh是第一个给我正确答案的人,所以我决定接受他的答案。 – Freewind

相关问题