【发布时间】:2021-09-30 17:47:06
【问题描述】:
我有一个字符串
Value = ('1 OR 2') OR Value = ('THREE OR FOUR')
我想用 OR 分割它(那个不在引号中)。
我怎么能用正则表达式呢?只有当我在 OR 之前有偶数个引号时,它才必须匹配。
有可能吗?
我尝试使用[\w\W]*?'[\w\W]*(\sOR\s),但它工作不正确,它只需要最后一个OR,即使它在引号内。
【问题讨论】:
我有一个字符串
Value = ('1 OR 2') OR Value = ('THREE OR FOUR')
我想用 OR 分割它(那个不在引号中)。
我怎么能用正则表达式呢?只有当我在 OR 之前有偶数个引号时,它才必须匹配。
有可能吗?
我尝试使用[\w\W]*?'[\w\W]*(\sOR\s),但它工作不正确,它只需要最后一个OR,即使它在引号内。
【问题讨论】:
使用[\w\W]可以匹配任何字符,包括'
您可以在 C# 中使用带有无限量词的环视并匹配可选的单引号对。
如果你想要整个字符串中的所有单引号对,你也可以将它们断言到右边。
如果不想交叉匹配换行符,可以使用[^'\r\n]* 代替[^']*
(?<=^(?:[^']*'[^']*')*[^']*)\bOR\b(?=(?:[^']*'[^']*')*[^']*$)
(?<= 正面回溯
^(?:[^']*'[^']*')*[^']* 匹配字符串开头的可选对或单引号) 近距离观察
\bOR\b 在单词边界之间匹配 OR(?= 正向前瞻
(?:[^']*'[^']*')*[^']*$匹配可选的引号对直到字符串的末尾) 关闭前瞻【讨论】:
(?:'[^'\r\n]*')* 模式不太可能匹配字符串其余部分中存在多对单引号的情况,因为它坚持结束一对的引号紧跟在下一对的开头引号之后。
使用正向向后查找可确保 OR 仅在其前面有偶数个单引号(并在正则表达式中被空格包围)时才匹配。
(?<=^(?:[^']*'[^']*')*[^']*)\sOR\s
【讨论】:
尝试匹配所有有效的内容并使用Regex.Matches 获取所有子字符串怎么样?
var splitRE = new Regex(@"([^'OR]+|O[^R]|'[^']*'|(?<!O)R|(?<=\w)OR|OR(?=\w))+", RegexOptions.Compiled);
var ans = splitRE.Matches(s);
基本上,该模式匹配任何不是单引号、O 或 R OR 匹配 O 并且后面不是 R OR 匹配单引号字符串 OR 匹配前面没有 O 的 R OR 匹配前面有单词的 OR字符 OR 匹配 OR 后跟一个单词字符。
【讨论】: