2017-02-08 5 views
0

次の形式で解析する文字列があり、区切り文字が続く電子メールと文字列を抽出しますJava/Scala電子メールと形式の電子メールの文字列を抽出する[区切り文字]文字列

言い換えれば
email[delimiter]string 

[任意のASCII文字を使用した電子メール]、[区切り文字] [任意のASCII文字の文字列]

区切り文字がすることができ、;:|または||例:

[email protected],blah 
[email protected];blah1 
[email protected]:blah2 
[email protected]|blah,2 
[email protected]||blah2 

私の進捗状況、これまで以上の文字列にマッチする正規表現を追従している私はJavaで区切り文字が続いているだけで、電子メールや文字列を抽出するために、適切なグループを形成することができるように、しかし、どのように私は、この正規表現を変更することができます/ Scalaの

[email protected]+([:;,|])+.+$ 

Javaコードは次のようになります。

// Create a Pattern object 
     Pattern r = Pattern.compile(pattern); 
     Matcher m = r.matcher(line); 

     if (m.find()) { 
      System.out.println("Email: " + m.group(0)); 
      System.out.println("Value: " + m.group(1)); 
     } else { 
      System.out.println("NO MATCH"); 
     } 
+0

(電子メール)(何でも)のようにあなたの文字列を考えれば、最初のグループを取得するだけです –

+0

ちょうど注 - 'グループ(0)'は完全一致です。グループ(1)とグループ(2)がほしいと思う。 –

+0

はい、それは私が投稿した答えでやっていることです。 – codehammer

答えて

1

それで、私が働いているもので自分の質問に答える。正規表現の専門家 - ここで見つけることのできる穴がありますか?

Pattern COMPILE = Pattern.compile("([email protected][A-Za-z0-9.\"]+)(?:[:;,|]+)(.*)"); 
Matcher m = COMPILE.matcher(next); 

if (m.find()) { 
    System.out.println(m.group(1)); 
    System.out.println(m.group(2)); 
} else { 
    System.out.println("NO MATCH"); 
} 

EDIT:あなた自身のための正規表現の部分を働いているように見えるMYGzの答え

+1

非キャプチャグループを使用することもできます。 ''(。+ @。+)(?:[:;、|] +)(。*) ''ならば、 '' m.group(1) '、' 'm.group(2)' ' – MYGz

0
(\\[email protected]\\w+)[:;,\\|](.+)$ 

その後、Javaを使ってマッチからグループを抽出します。グループ1は電子メールであり、グループ2は区切り文字の後の文字列です。

+0

ありがとうございますが、これはうまくいかないようです。何か不足していますか? – codehammer

2

あたりのような非キャプチャグループを使用するように編集。結果抽出のための提案があります:kantan.regexを使用してください。

これは、あなたが書くことができます:あなたはこのために、より良い型付き値を使用する場合があります

import kantan.regex.implicits._ 

// Declare your regular expression, validated at compile time. 
val regex = rx"([email protected][A-Za-z0-9.]+)(?:[:;,|]+)(.*)" 

// Sample input 
val input = "[email protected],blah" 

// Returns an Iterator[(String, String)] on all matches, where 
// ._1 is the email and ._2 the string 
input.evalRegex[(String, String)](regex) 

注 - というよりも(String, String)ケースクラス、と言います。これも可能です - あなたは、デコーダを自分で提供し、または型崩れがそれらを導出させることができ、次のいずれか

import kantan.regex.generic._ 

// Case class in which to store results. 
case class MailMatch(mail: String, value: String) 

// Returns an Iterator[MailMatch] 
input.evalRegex[MailMatch](regex) 

完全な開示:私は著者です。

関連する問題