regex - 用于选择花括号内的双引号而忽略外面的双引号的正则表达式
问题描述
我昨天问了一个问题,这个问题不够详细。此外,提供的建议看起来像是解决了我的问题。但也有边缘情况。所以我在转发。但这次有更多细节。
这是字符串:
"2019/03/19","LegacyApp","{""Id"":""345-dg8"",{""Hello"",""This""},""Fake"":""Sym""}","","","(null)","",
我想匹配下面突出显示的引号。
到目前为止,我得到的正则表达式是(?:[^{]+):(.*)$
但它一直在选择。并分两组。任何想法将不胜感激。
更新:现在我可以选择花括号之间的部分。{(?:\n|.)*}
. 不知何故需要匹配该选择中的双引号。
更新:这是有效的,但我不确定这个人的表现。
""(?=[a-zA-Z0-9])|""(?=})|""(?=:)|(?<=[a-zA-Z0-9])""
特别是因为这个正则表达式将针对被摄取的一百万个日志中的每一个运行。
注意:我正在尝试在 Elasticsearch 中运行它。根据他们的说法,Lucene 正则表达式引擎不兼容 Perl,但支持较小范围的运算符。
解决方案
有两种方法可以做到这一点。
我希望您使用每个语言中的正则表达式库提供的“偏移量”。它让您知道匹配文本的位置。
首先,使用这个正则表达式找出括号所在的位置。
{.+}
假设结果的偏移量是从 3 到 21。
然后,使用这个简单的正则表达式。
""
结果的偏移量返回一个数组,如 ([5,6], [12,13]...)
最后,使用 'for' 子句来挑出括号内的双引号。
另一种方法是以下正则表达式。
(?<={|{[^}]|{[^}][^}]|{[^}][^}][^}]|{[^}][^}][^}][^}]|{[^}][^}][^}][^}]|{[^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}]|{[^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}][^}])""|""(?=[^{]*})
推荐阅读
- javascript - 反应:在提交上获取数据,而不是在 onChange 上
- amazon-web-services - DynamoDB 多对多关系
- mysql - SQL Select 基于来自另一个表的部分字符串匹配
- html - 如何在 OpenRefine 上从这个 HTML 中提取国家代码?
- react-native - React-Native - useEffect 导致无限循环
- apache-spark - pyspark 数据帧的 Eager vs Non Eager 检查点
- mapkit - 如何启用在 mapkit js 中单击默认 POI 标记
- sql - 如何标记同时也是经理的员工
- java - 为什么即使我输入了超出给定范围的数字,我在 java 中的代码也不会输出消息“你违反了规则”?
- webpack - 如何为生成的 service worker 禁用 workbox-webpack-plugin 的警告