【问题标题】:A regex problem I can't figure out (negative lookbehind)我无法弄清楚的正则表达式问题(消极的后视)
【发布时间】:2009-02-09 16:32:12
【问题描述】:

我如何用正则表达式做到这一点?

我想匹配这个字符串:-myString

但我不想匹配此字符串中的-myString--myString

myString 当然是任何东西。

有可能吗?

编辑:

自从我发布一个问题以来,这里有一些关于我到目前为止所获得的信息:

string to match:
some random stuff here -string1, --string2, other stuff here
regex:
(-)([\w])*

这个正则表达式返回 3 个匹配项: -string1--string2

理想情况下,我希望它只返回 -string1 匹配项

【问题讨论】:

  • 顺便说一句-这很有趣,而且答案很有启发性,但正则表达式可能不是选项处理的正确工具(我怀疑这是你想要做的)
  • 好吧,如果我不能用正则表达式做到这一点,我会用不同的方式做。这就是为什么我想知道它是否可能:)
  • 我相信你可以做到。只是不是说这是最好的方法。但是,如果您知道这种方法,并且不知道(例如)FSM lexxing,并且它不会带来不可接受的性能或维护问题,请随意忽略我。干杯。
  • 因为你不能在字符串的开头/结尾使用锚点,你怎么知道string1、string2等什么时候结束?空白?逗号?
  • 是的,空格、逗号和其他标点符号

标签: c# regex lookbehind negative-lookbehind


【解决方案1】:

假设您的正则表达式引擎支持(负)lookbehind:

/(?<!-)-myString/

例如,Perl 有,Javascript 没有。

【讨论】:

  • 我的正则表达式机器是 .Net 中的机器。不知道它是否支持。
  • 确实如此。 "(?
  • Tomalak,是的,这正是我所需要的。您如何将其作为答案,以便我可以将其标记为已接受?
  • @Mladen Prajdic:不,这有点不公平。 Bart 的解决方案是正确的,发布一个微不足道的改进以获得“接受”检查是偷窃。 ;-) @Bart,您会将改进后的版本添加到您的答案中吗?
  • .Net 中是否需要//(甚至有效)?
【解决方案2】:

您想匹配以单个破折号开头的字符串,而不是包含多个破折号的字符串?

^-[^-]

解释:

^ Matches start of string
- Matches a dash
[^-] Matches anything but a dash

【讨论】:

  • 这将允许字符串后面有更多的破折号,可以吗?
  • 破折号只能出现在单词的开头。因此,如果在其后还有空间,则可能会出现dases。但同样的规则应该适用于他们
  • 这也只会匹配一个破折号和一个其他字符。即它会匹配 -m out of -myString.
  • 这个想法是从一个较大的字符串中提取匹配项,因此正则表达式不能被锚定,它必须匹配整个单词,而不仅仅是第一个字母。
【解决方案3】:
/^[^-]*-myString/

测试:

[~]$ echo -myString | egrep -e '^[^-]*-myString'
-myString
[~]$ echo --myString | egrep -e '^[^-]*-myString'
[~]$ echo test--myString | egrep -e '^[^-]*-myString'
[~]$ echo test --myString | egrep -e '^[^-]*-myString'
[~]$ echo test -myString | egrep -e '^[^-]*-myString'
test -myString

【讨论】:

    【解决方案4】:

    根据上次的编辑,我想下面的表达式会更好

    \b\-\w+
    

    【讨论】:

      【解决方案5】:

      [^-]{0,1}-[^\w-]+

      【讨论】:

      • 根据OP的编辑,需要子字符串匹配,所以锚点不起作用。
      • 已更新编辑。唯一的问题是他如何决定如何结束“mystring”部分。此示例使用空格。
      • 恐怕现在它完全坏了。 ;-) 我也绞尽脑汁寻找一个简单的无需后视的解决方案,但我认为没有一个,当需要匹配完整的字符串时。
      【解决方案6】:

      不使用任何后视,使用:

      (?:^|(?:[\s,]))(?:\-)([^-][a-zA-Z_0-9]+)
      

      爆发:

      (
        ?:^|(?:[\s,])        # Determine if this is at the beginning of the input,
                             # or is preceded by whitespace or a comma
      )
      (
        ?:\-                 # Check for the first dash
      )
      (
        [^-][a-zA-Z_0-9]+    # Capture a string that doesn't start with a dash
                             # (the string you are looking for)
      )
      

      【讨论】:

        猜你喜欢
        • 2013-02-14
        • 2021-05-18
        • 1970-01-01
        • 2015-10-09
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多