正则表达式 - 查找OR运算符之间的所有内容,除了引号之间的OR

时间:2015-10-29 09:43:41

标签: regex

我需要一些正则表达式的帮助。我有一个查询,应该在所有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"

如何使第一个表达式起作用,如何将这两个表达式组合起来?

谢谢你的帮助!

4 个答案:

答案 0 :(得分:2)

目前还不清楚你的表达语法是什么,所以我只是做了一堆假设,然后拿出这个正则表达式来匹配 OR之间的标记:< / p>

\G(\w+(?::"[^"]*")?|"[^"]*")(?:(\s+OR\s+)|\s*$)

Demo at regex101

我假设在OR之间,它可以是标识符\w+,带有字符串\w+:"[^"]*"的标识符,或字符串文字"[^"]*"

随意替换您自己的字符串文字定义 - 我使用最简单(和破碎)的规范"[^"]*"作为示例。

在每个匹配中,正则表达式从最后一个匹配停止的位置(或字符串的开头)开始,并匹配一个标记(如上所述),然后是OR或输入字符串的结尾。

(\s+OR\s+)处的捕获组是故意的 - 你需要这个来检查最后一个匹配是否实际终止于字符串的结尾,或输入是否格式错误。

买者

请注意,虽然我的解决方案会为此案例生成预期结果,但如果没有完整的表达式语法规范,则无法满足您可能要处理的所有可能情况。

答案 1 :(得分:2)

(?:^|OR(?=(?:[^"]*"[^"]*")*+[^"]*$))([\s\S]*?)(?=OR(?=(?:[^"]*"[^"]*")*+[^"]*$)|$)

您可以使用它并捕获groups。请参阅演示。

https://regex101.com/r/xC4rJ3/12

答案 2 :(得分:1)

尝试将引号中的所有内容匹配,或者不与-OR匹配:

(?:"[^"]+"|\b(?:(?!\bOR\b)[^"])+)+

DEMO

答案 3 :(得分:1)

这个正则表达式是最佳的(虽然它可以通过更详细的规范进行改进):

(?<!\S)(?!OR\s)[^\s"]*(?:"[^"]*"[^\s"]*)*

DEMO

(?<!\S)确保匹配从字符串的开头或空格字符开始。

(?!OR\s)阻止其与OR

匹配

[^\s"]*(?:"[^"]*"[^\s"]*)*按任意顺序匹配连续系列:

  • 非空白字符序列,非引号字符或

  • 除了引号之外的一对引号。

但是,我注意到你的例子中的所有标记都包含:

  • 非引用,非空格序列(NQ),

  • 引用序列(Q)或

  • NQ紧接着是Q.

如果您希望所有令牌都匹配该模式,则可以将正则表达式更改为:

(?<!\S)(?!OR\s)(?:[^\s"]*"[^"]*"|[^\s"]+) 

根据Regex101,它的效率稍高(但可能不够重要)。

DEMO