Regex не работает для некоторых случаев – PHP

У меня есть ряд строковых шаблонов, из которых я отфильтровываю свои данные и вставляю их в базу данных. Теперь я должен обрабатывать строки, которые не могут соответствовать моему старому регулярному выражению.

Это мое регулярное выражение:

$re = "/(?:Expiration Fee: )?(\d+)\s+((?:[a-zA-Z0-9\/]+\s+)*)(?:\(([a-zA-Z]+)\)\s+)?(?:>([0-9.]+)\s+)?(?:(\d+-\d+)\s+)?(?:\((\d{1,2}(?::\d{2})?[AP]M)\)\s+)?(?:@\s+([\d.]+))/"; 

Мой полный код:

 $re = "/(?:Expiration Fee: )?(\d+)\s+((?:[a-zA-Z0-9\/]+\s+)*)(?:\(([a-zA-Z]+)\)\s+)?(?:>([0-9.]+)\s+)?(?:(\d+-\d+)\s+)?(?:\((\d{1,2}(?::\d{2})?[AP]M)\)\s+)?(?:@\s+([\d.]+))/"; $strs = array("Expiration Fee: 10 LONG AUD/USD >.8189 (9:50AM) @ 90.5","10 Wall St 30 (Mar) >17900 (4:15PM) @ 69.5","2 AUD/USD >.8114 (11:35AM) @ 97.5","Expiration Fee: 1 SHORT AUD/USD >.8114 (11:35AM) @ 87","2 Wall St 30 (Mar) 18000-18100 (12PM) @ 18023","2 LONG US Tech 100 (Mar) >4284 (1:15PM) @ 56.5","1 EUR/USD >1.2180 (3PM) @ 41.5","Expiration Fee: 1 SHORT AUD/USD >.8114 (11:35AM) @ 87","Expiration Fee: 1 LONG GBP/USD >1.5090 (8:55PM) @ 95.5","Expiration Fee: 2 SHORT US 500 (Mar) >2037.7 (10AM) @ 5.5","Expiration Fee: 1 SHORT EUR/USD >1.1582 (2:20PM) @ 11.5","6 SHORT GBP/USD >1.5200 (3:10PM) @ 22.3333","Expiration Fee: 1 SHORT GBP/USD >1.5085 (8PM) @ 17.5","Expiration Fee: 1 SHORT EUR/GBP >.7340 (3PM) @ 33.25","2 Wall St 30 (Mar) 18000-18100 (12PM) @ 18023","Expiration Fee: 5 LONG US Tech 100 (Mar) 4190-4390 (4:15PM) @ 4291","2 LONG Wall St 30 (Mar) >18000 (1:15PM) @ 53.5","1 AUD/USD .7570-.7670 (2PM) @ 0.7626","1 US 500 (Jun) 2075.0-2085.0","1 US 500 (Jun) 2075.0-2085.0 (1PM) @ 2079","1 US 500 (Jun) 2075.0-2085.0 (1PM) @ 2079"," 1 AUD/USD .7570-.7670 (2PM) @ 0.7626","2 AUD/USD .8020-.8220 (11PM) @ 0.8118"); foreach ($strs as $subject) { echo "======<br />\n$subject<br />\n"; if (preg_match($re, $subject, $m)) for ($i=1; $i<count($m); $i++) if ($m[$i]) echo "$m[$i]<br />\n"; } 

Строковые шаблоны, которые не работают для меня:

 1 AUD/USD .7570-.7670 (2PM) @ 0.7626 1 US 500 (Jun) 2075.0-2085.0 1 US 500 (Jun) 2075.0-2085.0 (1PM) @ 2079 1 AUD/USD .7570-.7670 (2PM) @ 0.7626 2 AUD/USD .8020-.8220 (11PM) @ 0.8118 

Интернет-скриншот для демонстрации:

введите описание изображения здесь

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

 (?:Expiration Fee: )?(\d+)\s+((?:[a-zA-Z\d\/]+\s+)*)(?:\(([a-zA-Z]+)\)\s+)?(?:>([0-9.]+)\s+)?(?:([\d.]+-[\d.]+)\s*)?(?:\((\d{1,2}(?::\d{2})?[AP]M)\)\s+)?(?:@\s+([\d.]+))? 

См. Демонстрацию

Укороченная версия, которая будет использоваться с опцией i и с унифицированным сопоставлением цифр:

 (?:Expiration Fee: )?(\d+)\s+((?:[az\d\/]+\s+)*)(?:\(([az]+)\)\s+)?(?:>([\d.]+)\s+)?(?:([\d.]+-[\d.]+)\s*)?(?:\((\d{1,2}(?::\d{2})?[AP]M)\)\s+)?(?:@\s+([\d.]+))? 

Демонстрация 2

 ^(?:Expiration Fee: )?(\d+)\s+((?:[a-zA-Z0-9\/]+\s+)*)(?:\(([a-zA-Z]+)\)\s+)?(?:>([0-9.]+)\s+)?(?:([.\d]+-[.\d]+)\s*)?(?:\((\d{1,2}(?::\d{2})?[AP]M)\)\s+)?(?:@\s+([\d.]+))?$ ^^ ^^ ^^ ^^ 

Попробуйте это. Смотрите демоверсию.

https://regex101.com/r/uE3cC4/1

Также используйте anchors чтобы убедиться, что вы не выполняете частичные совпадения.