正则表达式可打破令牌但不能字符串

时间:2018-12-21 10:12:14

标签: javascript regex

我有一个查询字符串,我想知道它的标记。为此,我尝试了正则表达式

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'”作为单个标记。基本上,我希望标记变量并将其替换为变量而不影响字符串。

1 个答案:

答案 0 :(得分:2)

假设您的报价是均衡且不转义的,则可以使用超前使用此正则表达式:

/([-+\/%=|!&<>(),\[\]])(?=(?:(?:[^']*'){2})*[^']*$)/

RegEx Demo

var str = "SUM(1, one) + 12 + three + 'Hello + world'";

var re = /([-+\/%=|!&<>(),\[\]])(?=(?:(?:[^']*'){2})*[^']*$)/;

var arr = str.split(re);

console.log(arr)

RegEx详细信息:

  • (?:[^']*'){2}找到一对单引号
  • (([^']*'){2})*发现0对或更多对引号
  • [^']*$确保在最后匹配的报价之后没有其他报价
  • (?=...)断言我们前面的单引号数量是偶数,因此仅在单引号字符串之外匹配特殊字符。