首页 > 解决方案 > 在 MATLAB 中使用正则表达式提取文本数据

问题描述

我正在处理在 METAR(机场天气观测数据)中提取能见度数据。

能见度是一个4位(0~9)的数据,能见度好的也可以表示为'CAVOK'。

但是使用正则表达式非常棘手。(METAR 数据有很多变化。)

数据样本(MET_VIS)如下:

201903072300 METAR RKPC 072300Z 17003KT 110V210 CAVOK 05/02 Q1026 NOSIG=
201903062000 METAR RKPC 062000Z 33018G29KT 4000 BR FEW012 SCT025 08/04 Q1018 WS R13 R31 NOSIG=
201903062200 METAR RKPC 062200Z 33015KT 290V350 9999 SCT030 07/03 Q1019 NOSIG=
201903080000 METAR RKPC 080000Z 29002KT CAVOK 08/02 Q1027 NOSIG=

我想在每一行上提取 CAVOK、4000、9999、CAVOK。

我试过了,但这段代码不适用于第 3 行 :( 它返回空白。

regexp(MET_VIS(i),'((?<=KT\s)\d{4})|CAVOK','match')

标签: regexmatlab

解决方案


第三个值不在 KT 上结束。您可能会做的是使用另一个积极的后向检查来检查它之前的字符串是否以 KT 结尾并匹配匹配范围为 7 次 A-Z0-9 后跟一个空格字符。

然后你要么匹配 4 位数字,要么使用交替(?:\d{4}|CAVOK)匹配 CAVOK,否则你可以匹配字符串中任何位置的 CAVOK。

在它之后添加一个单词边界以防止匹配成为更大单词的一部分。

(?:(?<=KT\s)|(?<=KT [A-Z0-9]{7}\s))(?:\d{4}|CAVOK)\b

正则表达式演示


推荐阅读