我正在尝试编写一个正则表达式来基于将来可扩展的字符串来标记字符串,因为我对正则表达式非常陌生,所以我无法毫无问题地编写一个正则表达式。
现在我有以下模式的字符串(我正在尝试为自定义编程语言编写解析器)
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/