【问题标题】:Simple regex for matching up to an optional character?用于匹配可选字符的简单正则表达式?
【发布时间】:2011-08-14 21:10:00
【问题描述】:

我敢肯定,对于熟悉正则表达式的人来说,这是一个简单的问题:

我需要匹配所有内容,直到字符 #

我不想要 # 字符后面的字符串,只想要它之前的东西,并且字符本身不应该匹配。这是最重要的部分,也是我主要要问的。作为第二个问题,我还想知道如何匹配 # 字符之后的其余部分。但不是在同一个表达式中,因为我需要在另一个上下文中使用它。

这是一个示例字符串:

topics/install.xml#id_install

我只想要主题/install.xml。对于第二个问题(单独的表达式),我想要 id_install

【问题讨论】:

  • 请添加示例字符串...

标签: regex c#-4.0


【解决方案1】:

第一个表达式:

^([^#]*)

第二个表达方式:

#(.*)$

【讨论】:

  • 好的,如果我在第一个表达式中添加一个星号,这样就可以了,就像这样:^([^#]*)
  • 顺便说一句:这个标志是做什么的,开头:^?谢谢!
  • @Anders:更新了表达式。插入符号 ^ 从字符串的开头匹配,$ 从字符串的结尾匹配。
  • 好的,谢谢,但是当我尝试第二个表达式时,匹配中仍然包含 # 字符。尽管如此,第一个表达式是我在这里工作的唯一一个,所以我会以此作为答案。如果您能检查为什么第二个包含 # 字符,我将不胜感激!
  • @Anders:您访问的是$1 组还是整个匹配的字符串?
【解决方案2】:
[a-zA-Z0-9]*[\#]

如果您的字符串包含任何其他特殊字符,您需要将它们添加到第一个转义的方括号中。

【讨论】:

    【解决方案3】:

    我不使用 C#,但我会假设它使用 pcre...如果是这样,

    "([^#]*)#.*"
    

    调用“匹配”。对“搜索”的调用不需要结尾的“.*”

    括号定义了“保留组”; [^#] 表示任何不是“#”的字符

    你可能尝试过类似的东西

    "(.*)#.*"
    

    发现出现多个“#”符号时失败(保留前导“#”)? 那是因为“.*”是贪婪的,并且会尽可能匹配。

    你的匹配器应该有一个看起来像'group(...)'的方法。大多数匹配器 返回整个匹配序列作为组(0),第一个匹配的组作为组(1), 等等。

    PCRE 非常重要,我强烈建议您在 google 上搜索它,学习它,并始终将它放在您的编程工具包中。

    【讨论】:

      【解决方案4】:

      使用前瞻后瞻:

      • 要获取所有字符,但不包括井号 (#):.*?(?=\#)
      • 要获取后面的所有字符,但不包括井号 (#):(?<=\#).*

      如果您不介意使用群组,您可以一次性完成所有操作:

      • (.*?)\#(.*) 您的答案将在组(1)和组(2)中。请注意非贪婪构造 *?,它将尝试尽可能少地匹配而不是尽可能多地匹配。
      • 如果您想允许缺少# 部分,请使用([^\#]*)(?:\#(.*))?。它使用非收集组来测试下半部分,如果找到,则返回英镑之后的所有内容。

      老实说,对于您的情况,使用String 中提供的Split 方法可能更容易。

      More on lookahead and lookbehind

      【讨论】:

      • .*(?=#) 将匹配到最后一个 #,而不是第一个。此外,如果设置了扩展标志,最好将井号转义,因为某些引擎将其视为注释(# ... eol)。
      • 你是对的。更新了使用非贪婪的答案并逃脱了#
      【解决方案5】:

      首先: /[^\#]*(?=\#)/ edit:比/.*?(?=\#)/

      秒: /(?<=\#).*/

      【讨论】:

        【解决方案6】:

        对于 C# 中的类似内容,我通常会完全跳过正则表达式的内容并执行以下操作:

        string[] split = exampleString.Split('#');
        string firstString = split[0];
        string secondString = split[1];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-29
          相关资源
          最近更新 更多