Javascript 如何使用正则表达式解析此格式(ICAO飞行计划备注)?

Javascript 如何使用正则表达式解析此格式(ICAO飞行计划备注)?,javascript,regex,Javascript,Regex,我正在尝试构造一个正则表达式,可以用来从如下()所示的字符串中提取信息: DEP/S10 DEST/3W5 ALTN/1S2 RMK/测试,请忽略典型/自制 这个长字符串中有一系列单独的“备注”。每个备注都包含一个指示符(例如,DEP,DEST),一个正斜杠分隔符,然后是内容本身 例如,上面的字符串中有5个单独的备注,带有以下指标和内容: ╔═══════════╦════════════════════════╗ ║ Indicator ║ Content ║ ╠

我正在尝试构造一个正则表达式,可以用来从如下()所示的字符串中提取信息:

DEP/S10 DEST/3W5 ALTN/1S2 RMK/测试,请忽略典型/自制

这个长字符串中有一系列单独的“备注”。每个备注都包含一个指示符(例如,
DEP
DEST
),一个正斜杠分隔符,然后是内容本身

例如,上面的字符串中有5个单独的备注,带有以下指标和内容:

╔═══════════╦════════════════════════╗
║ Indicator ║ Content                ║
╠═══════════╬════════════════════════╣
║ DEP       ║ S10                    ║
║ DEST      ║ 3W5                    ║
║ ALTN      ║ 1S2                    ║
║ RMK       ║ TESTING, PLEASE IGNORE ║
║ TYP       ║ HOMEBUILT              ║
╚═══════════╩════════════════════════╝
我希望能够使用正则表达式解析这些信息,并捕获指示器和内容的组。我不确定这是否可行。特别是,我发现,如果不为下一个备注选择指示符,就很难提取内容部分(即,只匹配第一个备注的
S10
,而不是
S10 DEST

首先,可以使用以下正则表达式仅提取指标,而不提取内容:

(\w+)\//g

内容有点挑战性——它可以包含字母、数字、空格和大多数标点符号(不包括正斜杠)。基本上,它需要捕获任何字符,直到形式为
\w+\/
(一个或多个字符后跟正斜杠,表示下一个备注的开始)。我还没弄明白

这在正则表达式中是可能的吗


仅供参考,我希望使用JavaScript的正则表达式引擎来实现这一点。

您可以使用正向前瞻断言

(\w+)\/([^\/]+?)(?= \w+\/|$)


然后枚举所有匹配项,对于每个匹配项,组1将是指示符,组2将是内容。

您可以使用正向前瞻断言

(\w+)\/([^\/]+?)(?= \w+\/|$)


然后枚举所有匹配项,对于每个匹配项,第1组为指标,第2组为内容。

使用
split
for
循环查找指标和内容。不是最干净的方式,但可能

var info='DEP/S10 DEST/3W5 ALTN/1S2 RMK/测试,请忽略典型/自制';
var div=info.split('/');
var指标=[];
指示器推送(div[0]);
var内容=[];
var-curr;

for(i=1;i使用
split
for
循环查找指标和内容。这不是最干净的方法,但可能是

var info='DEP/S10 DEST/3W5 ALTN/1S2 RMK/测试,请忽略典型/自制';
var div=info.split('/');
var指标=[];
指示器推送(div[0]);
var内容=[];
var-curr;

对于(i=1;i使用String
split()
方法和表达式
/?(\w+\/)/
生成以下数组,其中包含每个备注指示符,后跟其内容

var input = "DEP/S10 DEST/3W5 ALTN/1S2 RMK/TESTING, PLEASE IGNORE TYP/HOMEBUILT";
var remarks = input.split(/ ?(\w+)\//);
[“”、“DEP”、“S10”、“DEST”、“3W5”、“ALTN”、“1S2”、“RMK”、“测试,请忽略”、“典型”、“自制”]

如果要删除初始空白值,还可以对结果数组执行
shift()

var input = "DEP/S10 DEST/3W5 ALTN/1S2 RMK/TESTING, PLEASE IGNORE TYP/HOMEBUILT";
var remarks = input.split(/ ?(\w+)\//);
remarks.shift();
[“DEP”、“S10”、“DEST”、“3W5”、“ALTN”、“1S2”、“RMK”、“测试,请忽略”、“典型”、“自制”]

来源

  • 使用字符串
    split()
    方法和表达式
    /?(\w+\/)/
    生成以下数组,其中包含每个备注指示符,后跟其内容

    var input = "DEP/S10 DEST/3W5 ALTN/1S2 RMK/TESTING, PLEASE IGNORE TYP/HOMEBUILT";
    var remarks = input.split(/ ?(\w+)\//);
    
    [“”、“DEP”、“S10”、“DEST”、“3W5”、“ALTN”、“1S2”、“RMK”、“测试,请忽略”、“典型”、“自制”]

    如果要删除初始空白值,还可以对结果数组执行
    shift()

    var input = "DEP/S10 DEST/3W5 ALTN/1S2 RMK/TESTING, PLEASE IGNORE TYP/HOMEBUILT";
    var remarks = input.split(/ ?(\w+)\//);
    remarks.shift();
    
    [“DEP”、“S10”、“DEST”、“3W5”、“ALTN”、“1S2”、“RMK”、“测试,请忽略”、“典型”、“自制”]

    来源

  • 为什么不在“/”上使用
    split()
    ,那么偶数索引是指示符,奇数是内容您可以尝试
    \w+/[^/]+?(?=\w+/$)
    regex-@depperm,它只会给您[DEP,S10 DEST,3W5 ALTN……]而不是指示符/内容“对”,这是有效的:
    /(\w+)\/(*)($)($)(?=\w+\/)/g
    ;剩下的就是在
    /
    上拆分每个项目。为什么不在“/”上使用
    split()
    ,那么偶数索引是指示符,奇数是内容您可以尝试
    \w+/[^/]+(?=\w+/$)
    regex-@depperm,它只会给您[DEP,S10 DEST,3W5 ALTN……]而不是指示符/内容的“对”:
    /(\w+)/(*?)(?:$|)(?=\w+\/)/g
    ;剩下的就是在
    /
    上拆分每个项目。