2012-03-25 4 views
0

Ich lerne Regex, und ich kann die Gruppierung in Java nicht verstehen. Zur Zeit meines regulärer Ausdruck istRegex Java Der erste Buchstabe ist nicht in der richtigen Gruppe enthalten?

([^:]?)(?![email])(\w+[\. ]?\w+)\ ?\@[\. ]?(\w+\.?\w+)\.edu 

Mein Ziel der Extrakt E-Mail-Adressen, die in verschiedenen Formaten kommen. Ein Beispiel für eine Linie der Zeichenfolge, die mit dieser nicht funktioniert, ist:

To get on the vcode mailing list, please email [email protected] 

Mein Ausdruck die richtige Zeichenfolge entspricht aber

group(1) = e 
group(2) = ngler 

Was ich will, ist

group(2) = engler 

Es funktioniert für andere Zeichenfolgen wie href = "mailto: [email protected]">

Danke, dass Sie sich die Zeit genommen haben, mir zu helfen aus. Übrigens verwende ich http://www.regexplanet.com/advanced/java/index.html, um mir zu helfen, es wandelt Regex-Ausdrücke in diejenigen, die Java versteht und zeigt Ihnen die Gruppierungen.

Danke Affe

Antwort: ([^:]?) (?! (E-Mail)) ([.] \ W + \ w +?) \ B \ b \ \ @ [?. ]? (\ w +.? \ w +). edu, ich wusste nicht, dass es von Charakteren behandelt wurde, danke.

+0

Genau was sind Regeln (abstrakt) für die Entscheidung, ob etwas extrahiert werden soll? Gerade anfangen, Ihre Regex zu lesen, auch der allererste Teil (Option nicht-Doppelpunkt?) Lässt mich fragen, was Ihre Kriterien sind. –

+0

Eckige Klammern um das Wort "E-Mail" lassen Ihre Regex ein Zeichen in der Menge {e, m, a, i, l} erfassen. Ich glaube nicht, dass das deine Absicht ist. – phatfingers

+0

@Ben Lee Ich versuche, jede Zeichenfolge zu extrahieren, die eine E-Mail in einer abstrakten Form enthält. Wie zum Beispiel jks an der Robotik, stanford, edu, ich sollte in der Lage sein, jks in einer Gruppe zu extrahieren, und robotics.stanford in einer anderen Gruppe. Sie kommen in vielen seltsamen Formen, es ist für einen Kurs, den ich nehme. Wenn Sie irgendwelche Vorschläge haben, wie ich meine Regex verbessern kann, teilen Sie mich gerne, da ich noch neu bin und lerne. – Miles

Antwort

1

Der Ausdruck [email] ist eine Zeichenklasse. es passt zu irgendeinem der Buchstaben e, m, a, i oder l. Es entspricht nicht dem Wort "E-Mail". Das wäre nur E-Mail ohne die Klammern. Deshalb greift es den e in engler auf. Statt

+0

@Miles Beachten Sie, dass wenn Sie nur die Klammern '[]' entfernen, Ihre Regex auch das Wort E-Mail in die Gesamtübereinstimmung einschließen wird.Das kann für das, was Sie brauchen, in Ordnung sein, aber wenn Sie das auch entfernen möchten, überprüfen Sie meine Antwort unten, die es lösen sollte. – Robbie

1

diese regex Versuchen:

([^:]?)(?<=email\s)(\w+[\. ]?\w+)\ ?\@[\. ]?(\w+\.?\w+)\.edu 

Ich habe die negative Vorschau auf einen positiven Lookbehind geändert, weil Sie, dass die Zeichen email behaupten wollen (mit einem Raum - ich habe ein \s dafür hinzugefügt) sollte dem Spiel vorausgehen.

Ich habe entfernt auch die [] Klammern aus email, da dies einem beliebigen Zeichen aus dem Wort E-Mail war passend und Ihre Gruppen brechen den Fang von e-

0

ziemlich gut eine Beschreibung (wie durch @Affe und @phatfingers darauf hingewiesen) Mail-Adressen mit einem Regex finden Sie hier: How to Find or Validate an Email Address

Das Parsen von E-Mail-Adressen ist ein ziemlich komplexes Problem, um reguläre Ausdrücke zu lernen. Sie könnten gut damit beginnen, mit mehreren einfacheren Problemen zu beginnen, deren Regeln einfacher formuliert werden können.

Verwandte Themen