2016-06-15 2 views
1

I pcre (php) reguläre Ausdrücke bin mit und haben die folgenden regulären Ausdruck entwickelt:Wie stellen Sie sicher, dass Ihre regulären Ausdruck das Auftreten eines Spiels entspricht

(?:-?)(?:[A-Z’\s\.-]{8}.*)(?:NY\s?|ON\s?|FL\s){1}([A-Z].*)(?:M\s\d{1,2}\s.*|F\s\d{1,2}.*) 

, dass ich versuche zu bewerben die folgenden Zeichenfolgen. Unter jeder Zielzeichenfolge habe I und dem tatsächliche Spiel gewünschtes Spiel vorgesehen:

SUNDAY GEISHA-SUNDAY BREAK-JP NYHIT IT ONCE MORE M 13 1116 Race 1 
Desired Match: HIT IT ONCE MORE 
Actual Match: CE MORE 

LOAD UP-DOVE HUNT FL SUMMATION TIME M 11 6T Race 6 
Desired Match: SUMMATION TIME 
Actual Match: TIME 

TEMPLE STREET-STREET CRY-IR KY DONWORTH M 12 1 Race 9 
Desired Match: DONWORTH 
Actual Match: WORTH 

jeweils statt beim ersten Auftreten einer Übereinstimmung zu stoppen, wird der reguläre Ausdruck mehr die Saite und passende zweites Spiel Auftreten raubend.

Sie können ein funktionierendes Beispiel hier bei regex101.com sehen: WORKING EXAMPLE

Wie kann ich meine regulären Ausdruck bekommen, das erste Spiel zu stoppen, damit ich meine gewünschte Ausgabe erreichen? Ich würde auch gerne Hinweise dazu bekommen, wie ich meinen Ausdruck verbessern kann.

Danke für Ihre Eingabe.

+1

Vielleicht, wenn Sie 'NY' übereinstimmen,' ON ',' FL' sollten Sie sicherstellen, dass ein Leerzeichen oder '-' vorangestellt ist, aber Sie werden immer noch Probleme mit Phrasen haben, die mit diesen Buchstaben beginnen. Ich denke, dass dieses Problem nicht mit nur einer Regex gelöst werden kann, es erfordert ein Wörterbuch englischer Wörter, um es 100% richtig zu machen. – Mike

+0

@Mike Wenn du ein Wörterbuch englischer Wörter sagst, was meinst du? Kannst du mich zu einem Beispiel führen, auf das du dich beziehst? – Mutuelinvestor

+1

Ich meine, dass im Allgemeinen gibt es keine Möglichkeit zu tun, was Sie wollen, es sei denn, Sie wissen zum Beispiel, dass "NYHIT" kein Wort ist. – Mike

Antwort

1

Beschreibung

^(?:[^ \n]* +){4}(.*?) +[a-z] +[0-9]+ [0-9a-z]+ Race [0-9]+$ 

Regular expression visualization

Beispiel

Live Demo

https://regex101.com/r/kF9cU8/2

Beispieltext

SUNDAY GEISHA-SUNDAY BREAK-JP NY HIT IT ONCE MORE M 13 1116 Race 1 
Desired Match: HIT IT ONCE MORE 
Actual Match: CE MORE 

LOAD UP-DOVE HUNT FL SUMMATION TIME M 11 6T Race 6 
Desired Match: SUMMATION TIME 
Actual Match: TIME 

TEMPLE STREET-STREET CRY-IR KY DONWORTH M 12 1 Race 9 
Desired Match: DONWORTH 
Actual Match: WORTH 

Probe Spiele

MATCH 1 
1. [33-49] `HIT IT ONCE MORE` 

MATCH 2 
1. [145-159] `SUMMATION TIME` 

MATCH 3 
1. [258-266] `DONWORTH` 

Erklärung

NODE      EXPLANATION 
---------------------------------------------------------------------- 
^      the beginning of a "line" 
---------------------------------------------------------------------- 
    (?:      group, but do not capture (4 times): 
---------------------------------------------------------------------- 
    [^ \n]*     any character except: ' ', '\n' 
          (newline) (0 or more times (matching the 
          most amount possible)) 
---------------------------------------------------------------------- 
    +      ' ' (1 or more times (matching the most 
          amount possible)) 
---------------------------------------------------------------------- 
){4}      end of grouping 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    .*?      any character except \n (0 or more times 
          (matching the least amount possible)) 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
    +      ' ' (1 or more times (matching the most 
          amount possible)) 
---------------------------------------------------------------------- 
    [a-z]     any character of: 'a' to 'z' 
---------------------------------------------------------------------- 
    +      ' ' (1 or more times (matching the most 
          amount possible)) 
---------------------------------------------------------------------- 
    [0-9]+     any character of: '0' to '9' (1 or more 
          times (matching the most amount possible)) 
---------------------------------------------------------------------- 
          ' ' 
---------------------------------------------------------------------- 
    [0-9a-z]+    any character of: '0' to '9', 'a' to 'z' 
          (1 or more times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    Race     ' Race ' 
---------------------------------------------------------------------- 
    [0-9]+     any character of: '0' to '9' (1 or more 
          times (matching the most amount possible)) 
---------------------------------------------------------------------- 
    $      before an optional \n, and the end of a 
          "line" 
---------------------------------------------------------------------- 
1

Nun, ein simplier (aber nicht sehr effizient) aproach:

/^.+(?:NY|FL|KY)\s?(.+?)(?: M.*)$/gmi 

bringen:

  1. "HIT IT ONCE"
  2. "SUMMIERUNG TIME"
  3. "DONWORTH"

Probieren Sie es aus: https://regex101.com/r/yX2bI1/4

+1

Bedenke, dass @Ro Yo Mi 's den Job mit 3x weniger Schritten erledigt. Haha – Jaumzera

Verwandte Themen