/ / Java / Scala Extrakt e-mail a reťazec s formátom e-mailu [oddeľovač] reťazec - java, regex, scala

Java / Scala Extrakt email a reťazec s formátom e-mailu [delimiter] string - java, regex, scala

Mám veľa strún, ktoré chcem analyzovať v nasledujúcom formáte a extrahovať len e-mail a reťazec, ktorý nasleduje oddeľovač

email[delimiter]string

Inými slovami [e-mail s akýmkoľvek znakom ascii] [oddeľovač] [reťazec s ľubovoľnými znakmi ascii]

Oddeľovače môžu byť:; alebo || napr.

abc@xyz.com,blah
abc@xyz.au;blah1
abc@xyz.ru:blah2
abc@xyz.ru|blah,2
abc@xyz.ru||blah2

Môj pokrok zatiaľ nasleduje po zhode regexuvyššie uvedené reťazce, ale ako môžem zmeniť tento regex, aby som vytvoril vhodné skupiny na extrahovanie iba e-mailu a reťazec, ktorý bude nasledovať oddeľovač v jazyku Java / Scala

.+@.+([:;,|])+.+$

Kód java bude vyzerať takto:

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

odpovede:

2 pre odpoveď č. 1

Zdá sa, že ste pre vás vypracovali časť regexu. Mám návrh na extrakciu výsledkov: použitie kantan.regex.

To vám umožňuje písať:

import kantan.regex.implicits._

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

// Sample input
val input = "abc@xyz.com,blah"

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

Všimnite si, že možno budete chcieť použiť lepšie zadané hodnoty pre túto - triedu prípadov ako a (String, String), povedať. To je tiež možné - môžete buď poskytnúť dekodéry sami, alebo nechať beztvaré odvodiť ich:

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)

Úplné zverejnenie: Ja som autorom.


1 pre odpoveď č. 2

Takže odpovedať na vlastnú otázku s tým, čo som pracovala. Experti Regex - akékoľvek dierky, ktoré nájdete tu, prosím?

Pattern COMPILE = Pattern.compile("(.+@[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: Upravené používať skupinu bez zachytenia podľa odpovede MYGz


0 pre odpoveď č. 3
(\w+@\w+)[:;,\|](.+)$

Potom použite jazyk Java na extrahovanie skupín zo zápasu. Skupina 1 je e-mail a skupina 2 je reťazec po oddeľovači.