我有一个查询字符串,我想知道它的标记。为此,我尝试了正则表达式
opt = /([+-/%=|!&<>(),\[\]])/g;
它工作得很好,但它也在字符串中创建令牌。
示例:
var str = "SUM(1, one) + 12 + three";
["SUM", "(", "1", ",", " one", ")", " ", "+", " 12 ", "+", " three"]
但是当这些参数在字符串中时,我不希望它们中断,但现在它正在执行: 示例:
var str = = "SUM(1, one) + 12 + three + 'Hello + world'";
["SUM", "(", "1", ",", " one", ")", " ", "+", " 12 ", "+", " three ", "+", " 'Hello ", "+", " world'"]
我不希望将“'Hello”,“ +”,“ world”作为单独的令牌。我希望将“'Hello + world'”作为单个标记。基本上,我希望标记变量并将其替换为变量而不影响字符串。
答案 0 :(得分:2)
假设您的报价是均衡且不转义的,则可以使用超前使用此正则表达式:
/([-+\/%=|!&<>(),\[\]])(?=(?:(?:[^']*'){2})*[^']*$)/
var str = "SUM(1, one) + 12 + three + 'Hello + world'";
var re = /([-+\/%=|!&<>(),\[\]])(?=(?:(?:[^']*'){2})*[^']*$)/;
var arr = str.split(re);
console.log(arr)
RegEx详细信息:
(?:[^']*'){2}
找到一对单引号(([^']*'){2})*
发现0对或更多对引号[^']*$
确保在最后匹配的报价之后没有其他报价(?=...)
断言我们前面的单引号数量是偶数,因此仅在单引号字符串之外匹配特殊字符。