首页 > 解决方案 > 正则表达式打破标记但不是字符串

问题描述

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

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'”作为单个标记。基本上我想标记变量并用我的变量替换它们而不影响字符串。

标签: javascriptregex

解决方案


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

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

正则表达式演示

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

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

var arr = str.split(re);

console.log(arr)

正则表达式详细信息:

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

推荐阅读