tokenize字符串的正则表达式

时间:2014-03-14 10:10:58

标签: javascript regex

我正在尝试编写一个正则表达式来基于一个字符串来标记字符串,该字符串将来可以扩展,因为我对正则表达式几乎是新手,我不能写一个没有问题。

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

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

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

variablename

:=

variablevalue

//a comment line

这里我试图基于很多东西来标记行,但是如果可以通过编写单个正则表达式来简化它,那么我可以将它扩展到许多其他分隔符。

2 个答案:

答案 0 :(得分:1)

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

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

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

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: ""
  }
]

答案 1 :(得分:0)

假设你真的想在这里使用正则表达式:

“=:”

的这条规则怎么样?
(\w+)[ \t]*:=[ \t]*"([^"]+)"[ \t]*;[ \t]*(//.*)?

第一个子表达式将匹配变量名称,第二个将匹配值,第三个匹配注释行。