我需要一些正则表达式的帮助。我有一个查询,应该在所有OR运算符之间进行拆分。但如果OR在引号内,则不应该分割。
示例:
这是查询:
"test1" OR "test2.1 OR test2.2" OR test3 OR test4:"test4.1 OR test4.2"
表达式1:我需要OR运算符之间的所有内容或行的开始/结束...(这不起作用)
(^|OR).*?(OR|$)
表达式2: ...除了引号之间的OR:
"(.*?)"
结果应为:
"test1"
"test2.1 OR test2.2"
test3
test4:"test4.1 OR test4.2"
如何使第一个表达式起作用,如何将这两个表达式组合起来?
谢谢你的帮助!
答案 0 :(得分:2)
目前还不清楚你的表达语法是什么,所以我只是做了一堆假设,然后拿出这个正则表达式来匹配 OR
之间的标记:< / p>
\G(\w+(?::"[^"]*")?|"[^"]*")(?:(\s+OR\s+)|\s*$)
我假设在OR
之间,它可以是标识符\w+
,带有字符串\w+:"[^"]*"
的标识符,或字符串文字"[^"]*"
。
随意替换您自己的字符串文字定义 - 我使用最简单(和破碎)的规范"[^"]*"
作为示例。
在每个匹配中,正则表达式从最后一个匹配停止的位置(或字符串的开头)开始,并匹配一个标记(如上所述),然后是OR
或输入字符串的结尾。
(\s+OR\s+)
处的捕获组是故意的 - 你需要这个来检查最后一个匹配是否实际终止于字符串的结尾,或输入是否格式错误。
请注意,虽然我的解决方案会为此案例生成预期结果,但如果没有完整的表达式语法规范,则无法满足您可能要处理的所有可能情况。
答案 1 :(得分:2)
(?:^|OR(?=(?:[^"]*"[^"]*")*+[^"]*$))([\s\S]*?)(?=OR(?=(?:[^"]*"[^"]*")*+[^"]*$)|$)
您可以使用它并捕获groups
。请参阅演示。
答案 2 :(得分:1)
答案 3 :(得分:1)
这个正则表达式是最佳的(虽然它可以通过更详细的规范进行改进):
(?<!\S)(?!OR\s)[^\s"]*(?:"[^"]*"[^\s"]*)*
(?<!\S)
确保匹配从字符串的开头或空格字符开始。
(?!OR\s)
阻止其与OR
[^\s"]*(?:"[^"]*"[^\s"]*)*
按任意顺序匹配连续系列:
非空白字符序列,非引号字符或
除了引号之外的一对引号。
但是,我注意到你的例子中的所有标记都包含:
非引用,非空格序列(NQ),
引用序列(Q)或
NQ紧接着是Q.
如果您希望所有令牌都匹配该模式,则可以将正则表达式更改为:
(?<!\S)(?!OR\s)(?:[^\s"]*"[^"]*"|[^\s"]+)
根据Regex101,它的效率稍高(但可能不够重要)。