2016-06-15 5 views
1

Я использую PCRE (PHP) регулярных выражений и разработали следующее регулярное выражение:Как вы убедитесь, что регулярное выражение соответствует появлению матча

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

То, что я пытаюсь применить к следующие строки. Ниже каждая целевая строку я предусмотрел нужный матч против фактического матча:

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 

В каждом случае вместо остановки при первом появлении матча, регулярное выражение отнимает больше строки и сопоставление второго вхождения матча.

Вы можете увидеть рабочий пример здесь regex101.com: WORKING EXAMPLE

Как получить мое регулярное выражение, чтобы остановить в первом матче, так что я достигну желаемого выхода? Я также приветствую любые указания на то, как я могу улучшить свое выражение.

Спасибо за ввод.

+1

Может быть, когда вы подходите 'NY',' ON', 'FL' вы должны убедиться, что ему предшествует пробел или' -', но все же у вас будут проблемы с фразами, начинающимися с этих букв. Я думаю, что эта проблема не может быть решена только с помощью регулярного выражения, для этого требуется словарь английских слов, чтобы сделать это на 100% правильно. – Mike

+0

@Mike Когда вы говорите словарь английских слов, что вы имеете в виду. Можете ли вы направить меня к примеру того, о чем вы говорите. – Mutuelinvestor

+1

Я имею в виду, что, как правило, вы не можете делать то, что хотите, если не знаете, например, что «NYHIT» - это не слово. – Mike

ответ

1

Описание

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

Regular expression visualization

Пример

Демо текст

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

Sample

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 

Образец Матчи

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

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

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

Объяснение
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

Ну, проще (но не более эффективным) Подход:

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

Принесет:

  1. "HIT IT РАЗ"
  2. "Суммирование ВРЕМЯ"
  3. "DONWORTH"

Попробуйте: https://regex101.com/r/yX2bI1/4

+1

Учтите, что @Ro Yo Mi выполняет эту работу с 3-кратным шагом. ха-ха – Jaumzera

Смежные вопросы