2011-03-13 12 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+ 

は、これは、いくつかの単語文字が続くオプションのドットまたはハッシュとして定義されている「用語」を意味します。

あなたはで終わるだろう:分割は正規表現ではなく、Regexを表すStringを取るので、あなたはRegexStringからrを変換してはならないこと

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

注意。正規表現の

簡単な説明:

  • (?<=...)は、ルックの背後にあります。この一致の前には、パターン...、またはケース\wが必要です。つまり、パターンに数字、文字、または下線を付けることを意味します。

  • \bは単語境界を意味します。これは、単語の文字(数字、文字、アンダースコア)と単語以外の文字の間で発生する長さゼロの一致です。長さがゼロであるため、splitは分割時に文字を削除しません。

  • (?!...)は否定先読みです。ここで私は、文字からダッシュまでの単語の境界には興味がないと言っています。ジョシュMの答えを皮切り

3

、彼は良い正規表現を持っていますが、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

ありがとうございます。しかし、@ジョシュは私に正しい答えを与える最初の人なので、私は彼の答えを受け入れることに決めました。 – Freewind

関連する問題