PHP正则表达式的更改取决于字符串


PHP regex change dependent on string

我有一个类似的字符串

2*O#QR   4 F0 P0 A0 J4 C2 D0 I0 Y9 LHRDOH 1505 2345      388 0E

为了获得我需要的数据,我有以下regex

^('d)+[^#$]*[#$](?'code1''p{Lu}{2})'s*(?'code2''d{1,4})'b's*(?<seat1>[A-Z][0-9.](?:'s+[A-Z][0-9.])*+)'s+(?<from>[A-Z]{3})(?<to>[A-Z]{3})'s+(?<other>.*'S)'s*

问题是,我使用的正则表达式获取了航空公司代码、座位、发件人、收件人和其他信息。所以对于上面的字符串,它看起来像

1. `2`
code1 `QR`
code2 `4`
seat1 `F0 P0 A0 J4 C2 D0 I0 Y9`
from `LHR`
to `DOH`
other `1505 2345 388 0E`

然而,有时我会得到如下字符串,regex将在上失败

3*O#QR 904 J4 C2 D0 I0 Y9 B9 H9 K9    MEL 0055 2125 #1   77W 0E

上面字符串的区别在于没有from,只有to(MEL)。有没有办法将我的正则表达式更改为只查找from和to(如果它们都存在)?如果没有,就去找?

感谢

问题是正则表达式的这一部分

(?<to>[A-Z]{3})'s+(?<other>.*'S)

它要求在空间之前有与(?<to>[A-Z]{3})匹配的内容。如果你把这部分改成

(?<to>[A-Z]{3})?'s+(?<other>.*'S)

也就是说,在(?<to>[A-Z]{3})之后和's 之前添加?

它将告诉正则表达式期望该模式为零或更多。

制作您的最终工作模式

^('d)+[^#$]*[#$](?'code1''p{Lu}{2})'s*(?'code2''d{1,4})'b's*(?<seat1>[A-Z][0-9.](?:'s+[A-Z][0-9.])*+)'s+(?<from>[A-Z]{3})(?<to>[A-Z]{3})?'s+(?<other>.*'S)'s*

我希望这是有意义的