【发布时间】:2022-01-21 19:20:57
【问题描述】:
我有这样的文字,每次我得到它时都会有所不同。它可以包含您看到的相同键或不同键。有时有些键根本不用:
FVPP21LPWU_1810301359 Page 1
FVPP21 LPWU 334230
VSHUAK1
DD ADVISORY
DTG: 20081218/1233Z
PSN: N5810 W11923
AREA: ALASKA PENINSULA
SUMMIT ELEV: 8225 FT (2507 M)
ADVISORY NR: 2018/013
COLOR CODE: ORANGE
DETAILS: EMISSIONS CONTINUE
OBS VA DTG: 30/2331Z
OBS VA CLD: LOW LEVEL EMISSIONS CONTINUE. COLOR CODE: NA
FCST GA CLD +6HU: 31/0531Z NO EXP.
FCST GA CLD +12HU: 31/1131Z NO TY EXP.
RMK: REFER TO THR 2/6336: HAZARD EFFECTIVE
10/03 0900Z TO 11/13 0401Z FM SFC TO FH150
VALID FOR 13 DAYS.
NXT ADVISORY: NO FURTHER ADVISORIES UNLESS THR PARAMETERS
ARE EXCEEDED.
DH NOV 2008 AAWU
我需要解析键和值。
Key 可以是单个单词、多个单词或单词、数字和“+”的组合的字符串。 值可以是字符串或多行字符串,并且可以包含一些已用作键“COLOR CODE: NA”的特定单词或以冒号分隔的单词\数字(这些子字符串必须不被解析为键值对)。
我能做的最好的就是这个正则表达式:
^([A-Z\s0-9\+]{1,}\:\s)([A-Z0-9\s\(\)\/\-.]{1,})\n
但是有些键没有被解析,而 DTG: 之前的字符串不应该被解析。
【问题讨论】:
-
^(.*\:\s)([A-Z0-9\s()\/\-.]{1,})\n 捕获所有键
-
当你给出一个例子时,如果你展示了你想要的结果,这对读者很有帮助(即使它对你来说似乎很明显)。
-
@MatthewMartin 如此接近!但并不完美。我只想将“RMK”作为键,而您的正则表达式给出“RMK:REFER TO THR 2/6336:”(第二个冒号)。 “OBS VA CLD:低水平排放继续。颜色代码:”应该只是“OBS VA CLD:”。此外,“任何更新都将在:GHLO@PERIL.COM 上提供”应与“除非超出 THR 参数,否则没有进一步的建议”一起使用。因为它是“NXT ADVISORY:”的值
-
请查看regex101.com/r/XdZODy/1。如果它与您的要求相匹配,请告诉我将其解释为答案。
/([^:\n]+)\s*:\s*((?:.*?(?=\n[^:\n]+:))|(?:.*?$))/igs