【问题标题】: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,即使它在引号内。

【问题讨论】:

    标签: c# regex


    【解决方案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 后跟一个单词字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多