【问题标题】:Regular expressions : How to make a conditional regex正则表达式:如何制作条件正则表达式
【发布时间】:2011-10-30 14:55:36
【问题描述】:

我的正则表达式有以下条件: 当字符串不为空时,它应该包含单词“internal”

换句话说:

"<link linktype='internal' id='{F88AE8AE-69C4-4E31-95BF-73B110FEE63A}' />" --> OK
"<link linktype='external' id='{F88AE8AE-69C4-4E31-95BF-73B110FEE63A}' />" --> NOK
"test" --> NOK
"" --> OK

我知道可以使用以下命令检查空字符串:^$
或非空字符串:^\s*\S
我的内部检查只是:linktype=\'internal\'(例如)

将它们放在一起是困难的部分。我一直坚持这一点,但它并没有达到预期的效果:

(?(?=^\s*\S)linktype=\"internal\"|^$)

谁能帮忙?

【问题讨论】:

  • 是否需要用正则表达式来完成?
  • 是的,这是该软件包中唯一可能的方法
  • 您使用的是 C#。您可以按照@Vache 的建议轻松完成。

标签: c# regex match conditional-statements


【解决方案1】:

既然提到了 C#,不妨试试这个:

if(str.Length == 0 || str.Contains("internal"))

它很有效,而且很简单。

【讨论】:

  • 是的,如果没有出现正则表达式答案,我将不得不通过将其耦合到我的项目来做类似的事情,但我猜正则表达式应该可以做到这一点。
  • 哦,你可以用正则表达式来做到这一点,但你必须问问自己是否应该这样做。 ;)
  • @Vache,我完全同意 :-) 尽管正则表达式功能强大,但您还需要查看代码的可读性。我可以查看这个答案并确切知道它的作用,而正则表达式答案并非如此。
【解决方案2】:

你可以试试(^$)|(^.*linktype=\"internal\".*$)

空字符串,或者带有文本linktype="internal"的字符串。

【讨论】:

  • 这对我来说可能已经足够了,但我仍然想知道应该如何完成条件和表达式。
  • 这是一个条件(| 是一个“或”),但也使用捕获,这需要 RE 做更多的工作。您可能需要一个非捕获组(即以(?: 而不是( 开头),如果字符串必须在任何地方包含“内部”检查,则不需要第二组中的锚点,如下所示:@ 987654326@
  • 另外,如果“linktype”可能有双引号或单引号,那么您必须再次修改它;第二组:(?:linktype=['\"]internal['\"]).
  • @kris:如果您想在 RE 中使用条件“and”表达式(这不是您的问题所需要的),您只需连接两个规则。虽然技术上匹配linktype=['"]internal['"]的部分是每个文字规则和字符集规则的“与”表达式,即:lin等。
【解决方案3】:

在这种特殊情况下,您可以使用:

^(.*linktype=['"]internal['"].*)?$

否则,为每种情况分别编写正则表达式,然后将它们括在括号中并使用“或”将它们包含在单个表达式中会更容易:

(^$)|(^.*linktype=['"]internal['"].*$)

这将匹配^$^.*linktype=['"]internal['"].*$

【讨论】:

    【解决方案4】:

    类似的东西呢

    (^$)|(^.*linktype=\"internal\".*$)
    

    --托马斯

    【讨论】:

      【解决方案5】:
      "<link linktype='internal' id='{F88AE8AE-69C4-4E31-95BF-73B110FEE63A}' />" --> OK
      "<link linktype='external' id='{F88AE8AE-69C4-4E31-95BF-73B110FEE63A}' />" --> NOK
      "test" --> NOK
      "" -->
      

      如果 linktype='internal' 匹配,您并不真正关心 linktype='internal' 之前和之后的内容,无论如何您都会得到匹配:

      (^$)|(linktype='internal')
      

      【讨论】:

        【解决方案6】:

        应该这样做:

        ^.*linktype='(internal|)'.*$
        

        【讨论】:

          【解决方案7】:

          也许我应该添加自己的答案。到目前为止的答案都使用了成本稍高的捕获组。对非捕获组使用“或”条件:

          (?:^$)|(?:linktype=['\"]internal['\"])
          

          第二部分不需要锚点,因为根据定义,RE 将匹配字符串中没有锚点的任何位置。

          此外,要在 RE 中使用“and”条件,您只需将规则连接在一起即可。这就是上述RE的实际形成方式。它是 (anchor start AND anchor end) OR (an l AND i AND n ... AND 字符集 ['"] AND i AND ... etc...)

          【讨论】:

            【解决方案8】:
            string regex = "^(?:\\n|.*linktype=([\'\"])internal\\1.*\\n)";
            var options = RegexOptions.Multiline);
            var reg = new Regex(regex, options);
            

            【讨论】:

              猜你喜欢
              • 2018-03-21
              • 1970-01-01
              • 2022-07-06
              • 1970-01-01
              • 1970-01-01
              • 2016-09-19
              • 1970-01-01
              • 2015-12-29
              • 1970-01-01
              相关资源
              最近更新 更多