2011-03-13 89 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

相關問題