javascript - 使用 Regex 提取 GOTO/GOSUB 的行号

标签 javascript node.js regex

我正在尝试从 BASIC 代码中提取 GOTOs/GOSUBs 行号。我打算使用 NodeJS 来管理匹配(所以它是 JS 风格的正则表达式)。

我正在使用 regex101.com 进行测试(参见此处 https://regex101.com/r/SaZuue/2 )并且我非常接近我想要的:

  • GOTO ### 提取为 ["GOTO", "", "###"]
  • GOSUB ### 提取为 ["GOSUB", "", "###"]
  • IF (cond) THEN ### 提取为 ["THEN", "", "###"]
  • ON ERR GOTO #, ##, ### 提取为 ["GOTO", "", "#", ", ", "##", ", ", "###"]
  • 与上面相同,但带有 ON ERR GOSUB
  • 处理 GOTOGOSUBTHEN, 之间的空格是可选的或可以是多个并在所有情况下返回指定的确切空格数。

到目前为止,我提出了以下正则表达式:

/(GOTO|GOSUB|THEN)(\s*)(\d+)(?:(\s*,\s*)(\d+))*/ig

测试:

100 ON ERR GOTO 10000, 30, 200, 10,800: GOSUB 20: IF A THEN 10: GOTO30: GOTO 50

ON ERR GOTO 外,所有匹配组均正常,它仅返回第一个和最后一个数字(10000 和 800),而不返回其他数字。

我错过了什么?谢谢:)

最佳答案

无法使用正则表达式进行任意数量的捕获,也无法使用 JS RegExp 访问单个组内的多个捕获,因为它不存储每个组的捕获值堆栈(后续捕获重写现有的,因此,每组仅存储最后一次捕获)。

捕获以逗号分隔的数字的条纹,然后拆分以分别获取它们。例如。使你的模式的结尾看起来像 ((?:\s*,\s*\d+)*) (匹配 0+ 序列的 , 包含在 0+空格后跟 1+ 个数字),然后在匹配时用 /\s*,\s*/ 和过滤器拆分。

查看 JS 演示:

var rx = /\b(GO(?:TO|SUB)|THEN)(\s*)(\d+)((?:\s*,\s*\d+)*)/gi;
var str = "100 ON ERR GOTO 10000, 30,   200, 10,800: GOSUB 20: IF A THEN 10: GOTO30: GOTO  50";
var m;
while ((m = rx.exec(str)) !== null) {
   console.log( [m[1], m[2], m[3], m[4].split(/\s*,\s*/).filter(Boolean)] );
}

关于javascript - 使用 Regex 提取 GOTO/GOSUB 的行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46151114/

相关文章:

php - 如何让表格内容自动以弹出形式显示

node.js - 有没有人在node-js中找到或开发了一个好的couchdb管理器?

regex - 重定向到其他域但保留键入的域

regex - 如何使用正则表达式查找是否在多个不同位置使用了相同字符?

javascript - 如何在另一个字符之前插入一个字符?

javascript - 为什么向 Observable 添加属性时会出现 TypeError

javascript - 服务器端页面加载之前的 Vb asp.net JavaScript?

node.js - 收到付款后如何执行功能(Sofort)?

python - cd 目录不存在?

java - 使用正则表达式在字符串(a href)中查找片段