javascript - 标记化字符串的正则表达式

标签 javascript regex

我正在尝试编写一个正则表达式来基于将来可扩展的字符串来标记字符串,因为我对正则表达式非常陌生,所以我无法毫无问题地编写一个正则表达式。

现在我有以下模式的字符串(我正在尝试为自定义编程语言编写解析器)

variablename[space]:=[space]"variablevalue"; //a comment line

考虑到空格是可选的,我想看看是否可以编写一个正则表达式来解析这一行,如下所示,省略空格。

variablename

:=

variablevalue

//a comment line

在这里,我尝试根据许多事情来标记该行,但如果可以通过编写单个正则表达式来简化它,那么我可以将其扩展为许多其他分隔符。

最佳答案

免责声明:以下内容并不处理所有情况,例如注释、文字等。这只是如何编写虚拟词法分析器的示例!

使用正则表达式来标记表达式永远不如编写完整的词法分析器(或使用现有的词法分析器)。

根据您发布的内容,您可以尝试以下操作:

function tokenize(expr) {
  return expr.match(/(;|:=|[a-zA-Z]\w*|(["'])[^\2]*\2)/g);
}

用法:

> tokenize("variable := 'Some expr';")
["variable", ":=", "'Some expr'", ";"]

您可以通过识别标记类型来改进词法分析器:

function tokenize(expr) {
  return expr.match(/(;|:=|[a-zA-Z]\w*|(["'])[^\2]*\2|$)/g).map(function(token) {
    var type;
    if (!token) {
      type = 'EOF';
    } else if (token === ':=' || token === ';') {
      type = 'Punctuator';
    } else if (token[0] === '"' || token[0] === "'") {
      type = 'StringLiteral';
    } else {
      type = 'Identifier';
    };

    return {
      type: type,
      value: token
    };
  });
}

结果是:

> tokenize("variable := 'Some expr';")
[
  {
    type: "Identifier",
    value: "variable"
  },
  {
    type: "Punctuator",
    value: ":="
  },
  {
    type: "StringLiteral",
    value: "'Some expr'"
  },
  {
    type: "Punctuator",
    value: ";"
  },
  {
    type: "EOF",
    value: ""
  }
]

关于javascript - 标记化字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22401956/

相关文章:

regex - 否定正则表达式以使用 MVC 验证属性

javascript - 使用 setTimeout 绕过 IE 的长时间运行脚本警告

Java正则表达式用于匹配字符串中的多个键

javascript - dgrid - 可编辑字段之间的键选项卡导航

javascript - 使用 AngularJS 从数组中创建统计数据

python - 重叠的正则表达式

java - 根据此模式检查任何文本 :A sentence that consist of two or more questions

java - String.matches 不匹配模式

javascript - AJAX 不会覆盖已经加载的脚本?

javascript - 检查多个输入空值不起作用