javascript - 正则表达式打破标记但不是字符串
问题描述
我有一个查询字符串,我想知道它的标记。为此我尝试了正则表达式
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'”作为单个标记。基本上我想标记变量并用我的变量替换它们而不影响字符串。
解决方案
假设您的报价是平衡的且未转义,您可以使用前瞻使用此正则表达式:
/([-+\/%=|!&<>(),\[\]])(?=(?:(?:[^']*'){2})*[^']*$)/
var str = "SUM(1, one) + 12 + three + 'Hello + world'";
var re = /([-+\/%=|!&<>(),\[\]])(?=(?:(?:[^']*'){2})*[^']*$)/;
var arr = str.split(re);
console.log(arr)
正则表达式详细信息:
(?:[^']*'){2}
找到一对单引号(([^']*'){2})*
找到 0 对或更多对引号[^']*$
确保在最后一个匹配的报价之后我们没有更多的报价(?=...)
断言我们前面有偶数个单引号,因此仅匹配单引号字符串之外的特殊字符。
推荐阅读
- dart - 如何用 Dart 语言将双重类型的数据提升为一种力量?
- android - Android Room通过自动增量值强制重写属性
- javascript - 在本地存储 JS 中存储对象
- python - Python Dataframe:从df行中删除奇数位置的数字?
- reactjs - 构建 React 应用程序时是否可能存在漏洞?
- python - 用户在 Django 中的表单中上传后,图像未加载到 HTML 中
- python - RuntimeWarning:在 double_scalars 和 TypeError 中遇到无效值:“NoneType”对象不可调用
- next.js - 在最新版本的 next.js 中使用 apollo 服务器
- c - STM32F103芯片大约每500ms保持一次复位
- python - 如何使用 python/bash 脚本在 Centos7 中列出所有早于“X”小时的文件?