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ď č. 1Zdá 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.