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



我有一个类似的字符串

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})bs*(?<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})bs*(?<seat1>[A-Z][0-9.](?:s+[A-Z][0-9.])*+)s+(?<from>[A-Z]{3})(?<to>[A-Z]{3})?s+(?<other>.*S)s*

我希望这是有意义的

最新更新