2 Stimmen

Regex zum Abgleichen einer Zeichenkette mit optionalen Bedingungen

重複の可能性あり。
Wie kann ich einen Teil eines regulären Ausdrucks in Ruby optional machen?

Ich versuche, einen regulären Ausdruck mit rubular zu erstellen:

On Feb 23, 2011, at 10:22 , James Bond wrote:

OR

On Feb 23, 2011, at 10:22 AM , James Bond wrote:

Hier ist, was ich bis jetzt habe, aber aus irgendeinem Grund passt es nicht? Ideen?

(On.* (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2}, [12]\d{3}.* at \d{1,2}:\d{1,2} (?:AM|PM),.*wrote:)

Wie kann ich den AM/PM-Text optional machen? Entweder AM/PM oder keins von beidem?

0 Stimmen

Das Wort "regex" wird klein geschrieben, nicht in GROSSBUCHSTABEN.

1voto

the Tin Man Punkte 154584

Dies scheint die Datumsangaben zu erfassen. Ich habe absichtlich in Gruppen erfasst, damit es einfacher ist, ein echtes Datum zu erstellen:

regex = /^On (\w+ \d+, \d+), \w+ (\S+) (\w*)\s*,/

[
  'On Feb 23, 2011, at 10:22 , James Bond wrote:',
  'On Feb 23, 2011, at 10:22 AM , James Bond wrote:'  
].each do |ary|
  ary =~ regex
  puts "#{$1} #{$2} #{$3}"
end
# >> Feb 23, 2011 10:22 
# >> Feb 23, 2011 10:22 AM

Ich habe absichtlich nicht versucht, die Monate aufeinander abzustimmen. Ihre Beispielstrings sehen aus wie die Kopfzeilen von E-Mail-Nachrichten. Diese sind sehr standardisiert und werden von Software generiert, so dass das Format sehr einheitlich sein sollte, was eine Vereinfachung der Regex ermöglicht. Wenn Sie diesen nicht trauen können, sollten Sie die Abkürzungen der Monatsnamen verwenden, um falsch-positive Treffer zu vermeiden. Das Gleiche gilt für die Werte für Tag, Jahr und Uhrzeit.

Das Wichtigste an der Regex ist, wie man mit dem AM/PM umgeht, wenn es fehlt.

0voto

kurumi Punkte 24377

Vielleicht das

(On\s+(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+\d{1,2},\s+[12]\d{3},\s+at\s+\d{1,2}:\d{1,2}\s+(?:AM|PM)*,.*wrote:)

Wenn Sie jedoch überprüfen können und sicher sein können, dass nur diese Zeilen eindeutig sind, müssen Sie nicht eine ganze Reihe von Regex verwenden. Vielleicht beginnt sie mit "On" und endet mit "wrote:", dann könnte Ihre Regex einfach lauten /^On.*wrote:/

0voto

markijbema Punkte 3903

Verwenden Sie einfach den Fragezeichenoperator nach jeder Gruppe, die optional sein soll, also in diesem Fall:

(?:(?:AM|PM) )?

Achten Sie darauf, dass auch die Leerzeichen übereinstimmen, sonst müssen die Strings ohne AM/PM zwei Leerzeichen enthalten. Die Lösung mit (?:AM|PM)* würde auch mit AMAMPM also ist das wahrscheinlich nicht das, was Sie wollen. Aber warum passen Sie diese Gruppe an, ohne Rückverweise zu erstellen? Werden Sie die Werte nicht verwenden?

Für Informationen über Rückverweise: http://www.regular-expressions.info/brackets.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X