我正在尝试编写一个正则表达式来基于一个字符串来标记字符串,该字符串将来可以扩展,因为我对正则表达式几乎是新手,我不能写一个没有问题。
现在我有以下模式的字符串(我正在尝试为自定义编程语言编写解析器)
variablename[space]:=[space]"variablevalue"; //a comment line
考虑空间是可选的,我试图看看是否可以编写正则表达式来解析这一行,如下所示,省略空格。
variablename
:=
variablevalue
//a comment line
这里我试图基于很多东西来标记行,但是如果可以通过编写单个正则表达式来简化它,那么我可以将它扩展到许多其他分隔符。
答案 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]*(//.*)?
第一个子表达式将匹配变量名称,第二个将匹配值,第三个匹配注释行。