我有一个类似的字符串
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*
我希望这是有意义的