正则表达式:如果条件发生则匹配值

Posted

技术标签:

【中文标题】正则表达式:如果条件发生则匹配值【英文标题】:Regexp: Match value if condition occurs 【发布时间】:2021-09-30 17:47:06 【问题描述】:

我有一个字符串 Value = ('1 OR 2') OR Value = ('THREE OR FOUR') 我想用 OR 分割它(那个不在引号中)。 我怎么能用正则表达式呢?只有当我在 OR 之前有偶数个引号时,它才必须匹配。 有可能吗? 我尝试使用[\w\W]*?'[\w\W]*(\sOR\s),但它工作不正确,它只需要最后一个OR,即使它在引号内。

【问题讨论】:

【参考方案1】:

使用[\w\W]可以匹配任何字符,包括'

您可以在 C# 中使用带有无限量词的环视并匹配可选的单引号对。

如果你想要整个字符串中的所有单引号对,你也可以将它们断言到右边。

如果不想交叉匹配换行符,可以使用[^'\r\n]* 代替[^']*

(?<=^(?:[^']*'[^']*')*[^']*)\bOR\b(?=(?:[^']*'[^']*')*[^']*$)
(?&lt;= 正面回溯 ^(?:[^']*'[^']*')*[^']* 匹配字符串开头的可选对或单引号 ) 近距离观察 \bOR\b 在单词边界之间匹配 OR (?= 正向前瞻 (?:[^']*'[^']*')*[^']*$匹配可选的引号对直到字符串的末尾 ) 关闭前瞻

Regex demo

【讨论】:

前瞻肯定是不必要的,并且在任何情况下都是不正确的:(?:'[^'\r\n]*')* 模式不太可能匹配字符串其余部分中存在多对单引号的情况,因为它坚持结束一对的引号紧跟在下一对的开头引号之后。 @MikeM 啊,是的,领先的否定字符类应该在重复组中。【参考方案2】:

使用正向向后查找可确保 OR 仅在其前面有偶数个单引号(并在正则表达式中被空格包围)时才匹配。

(?<=^(?:[^']*'[^']*')*[^']*)\sOR\s

【讨论】:

【参考方案3】:

尝试匹配所有有效的内容并使用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 后跟一个单词字符。

【讨论】:

以上是关于正则表达式:如果条件发生则匹配值的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL - 如果不在类别中并且正则表达式匹配内容,则:(添加到类别并从其他类别中删除)

Python 学习之路 - 正则表达式

正则表达式 - 如果开始匹配则匹配结束

js正则表达式test方法exec方法与字符串search方法区别

Oracle 正则表达式函数-REGEXP_INSTR 使用例子

MySQL正则表达式