2017-02-08 102 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中的分隔符字符串/斯卡拉

[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"); 
} 

编辑:编辑使用非捕获组按照MYGz的答案

+1

您也可以使用非捕获组。 '。(。+ @。+)(?:[:;,|] +)(。*)“',然后'm.group(1)','m.group(2)' – MYGz

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

然后使用Java从Match中提取组。组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) 

全面披露:我是作者。

相关问题