2016-04-06 12 views
-2

とScalaの文字列を分割するには、私は val pattern = "(\\w+)\\|(.*)\\|\\[(.*)\\]\\|\"(.*)\"\\|\"(.*)\"\\|\\[(.*)\\]\\|\\[(.*)\\]\\|(.*)\\|\\[(.*)\\]\\|\\[(.*)\\]".rどのように正規表現

のようなパターンを思い付くと、私は元の文字列を持っている

var str = """AuthLogout|vmlxapp21a|[13/Jan/2016:16:33:15 +0100]|"66.77.444.44 uid=XXXXX,ou=People,o=Bank,o=External,dc=xxxx,dc=com"|"abcd_123_portalweb_w "|[]|[41]||[]|[]""" 

、文字列にパターンを適用するが、それは常に空です。

val items = pattern.findAllIn(str).toList

+0

はとORS '「\」括弧' [] 'をエスケープしないでください...しかし、私はあなたのコードでこれを持つことはお勧めしません - この正規表現は、それがここでは、どのようなものか見てみたいです'。 –

答えて

2

私はあなたがおそらくない最も簡単な方法は巨大な正規表現を使用して、何をしようとして理解していれば:あなたは|によりsplitことができ、不要なセパレータ([]"を取り除きます)replaceAllを使用して:

印刷
val str = """AuthLogout|vmlxapp21a|[13/Jan/2016:16:33:15 +0100]|"66.77.444.44 uid=XXXXX,ou=People,o=Bank,o=External,dc=xxxx,dc=com"|"abcd_123_portalweb_w "|[]|[41]||[]|[]""" 
val withoutBoundaries = str.replaceAll("[\"\\]\\[]","") 
val result = withoutBoundaries.split("\\|") 
result.foreach(println) 

AuthLogout 
vmlxapp21a 
13/Jan/2016:16:33:15 +0100 
66.77.444.44 uid=XXXXX,ou=People,o=Bank,o=External,dc=xxxx,dc=com 
abcd_123_portalweb_w 

41 

あなたは、私は、これはやや扱いにするために、あなたは後にしている別のテキスト部分を表すサブ正規表現VARSを作成したい、ここで正規表現を使用するたい場合:

val plain = "(.*)"    // no boundary characters 
val boxed = s"\\[$plain\\]"  // same, encapsulated by square brackets 
val quoted = '"' + plain + '"' // same, encapsulated by double quotes 

// the whole thing, separated by pipes: 
val r = s"$plain\\|$plain\\|$boxed\\|$quoted\\|$quoted\\|$boxed\\|$boxed\\|$plain\\|$boxed\\|$boxed".r 

val result = r.findAllIn(str).toList // this list has one item, as expected. 

、あなたの場合|

val r = """(.*)\|(.*)\|\[(.*)\]\|"(.*)"\|"(.*)"\|\[(.*)\]\|\[(.*)\]\|(.*)\|\[(.*)\]\|\[(.*)\]""".r