Regex 如何用正则表达式过滤这个?

Regex 如何用正则表达式过滤这个?,regex,filter,Regex,Filter,我有一个问题,我想从字符串中提取这些数字,但只有当它们后面没有“foo”时 例如: “12:13福”(否) “12:22布拉”(是) 我有正则表达式: (\d+):(\d+) 并且不知道如何防止它选择数字后面带有“Foo”的字符串。这在某种程度上取决于您的正则表达式风格,但如果它支持,您可以使用: (\d+):(\d+) (\s*)(^[Ff]^[Oo]^[Oo])(\s*) (\d+):(\d+)(?:\s+(?!Foo)|$) 但是,这不匹配12:34Bar(4和B之间没有空格)

我有一个问题,我想从字符串中提取这些数字,但只有当它们后面没有“foo”时

例如:

  • “12:13福”(否)
  • “12:22布拉”(是)
我有正则表达式:

(\d+):(\d+)

并且不知道如何防止它选择数字后面带有“Foo”的字符串。

这在某种程度上取决于您的正则表达式风格,但如果它支持,您可以使用:

(\d+):(\d+) (\s*)(^[Ff]^[Oo]^[Oo])(\s*)
(\d+):(\d+)(?:\s+(?!Foo)|$)
但是,这不匹配
12:34Bar
(4和B之间没有空格)

另一个编辑:如果您可以使用原子摸索,那么我认为这将涵盖最后一个数字和后面的单词之间没有空格的情况,以及前面的情况():


这在某种程度上取决于您的正则表达式风格,但如果它支持,您可以使用:

(\d+):(\d+)(?:\s+(?!Foo)|$)
但是,这不匹配
12:34Bar
(4和B之间没有空格)

另一个编辑:如果您可以使用原子摸索,那么我认为这将涵盖最后一个数字和后面的单词之间没有空格的情况,以及前面的情况():

(更新答案)

通过添加负前瞻
(?!Foo)
,它将只匹配不以“Foo”结尾的字符串。它还将两个数字组捕获到反向参考1和2中

匹配项:

  • 12:34
  • 12:22布莱
  • 1:1
不匹配:

  • 12:13福
  • 12:13Foo
  • 12:13福
    • (更新答案)

      通过添加负前瞻
      (?!Foo)
      ,它将只匹配不以“Foo”结尾的字符串。它还将两个数字组捕获到反向参考1和2中

      匹配项:

      • 12:34
      • 12:22布莱
      • 1:1
      不匹配:

      • 12:13福
      • 12:13Foo
      • 12:13福

      现在,
      ^
      与输入的开头匹配,它不会像您可能认为的那样进行否定。它仅在放置在字符类的开头时才求反:
      [^a]
      匹配除
      a
      之外的任何字符。
      ^
      现在匹配输入的开头,它不会像您可能认为的那样求反。它仅在放置在字符类的开头时才起反作用:
      [^a]
      匹配除
      a
      @mullek之外的任何字符,请注意,这仅在
      \d+:\d+
      位于输入字符串的开头时起作用。如果要在字符串中搜索这些匹配项,请从建议的正则表达式中删除
      ^
      $
      。@eldarerathis,这与
      12:22 Bla
      不匹配,因为正则表达式只匹配以
      \s*$
      结尾的字符串。@mullek:是的,@Bart Kiers的观点很好。如果该模式存在于字符串的中间,则移除锚(<代码> ^ < /COD>和<代码> $> /代码>)。Nope,<代码>(\d+):(\d+)s+[[ff] [^ o] [^ O] 将不匹配<代码> 11:11Ab/COD> >只命名一个字符串。我只想后退,只留下
      (\d+):(\d+)\s*(?!Foo)
      。@Bart Kiers:Hm,没错。我将继续介绍我们所知道的有效方法。@mullek,请注意,只有当您的
      \d+:\d+
      位于输入字符串的开头时,这才有效。如果要在字符串中搜索这些匹配项,请从建议的正则表达式中删除
      ^
      $
      。@eldarerathis,这与
      12:22 Bla
      不匹配,因为正则表达式只匹配以
      \s*$
      结尾的字符串。@mullek:是的,@Bart Kiers的观点很好。如果该模式存在于字符串的中间,则移除锚(<代码> ^ < /COD>和<代码> $> /代码>)。Nope,<代码>(\d+):(\d+)s+[[ff] [^ o] [^ O] 将不匹配<代码> 11:11Ab/COD> >只命名一个字符串。我只想后退,只留下
      (\d+):(\d+)\s*(?!Foo)
      。@Bart Kiers:Hm,没错。我只想介绍一下我们知道的有用的东西。但是它不会匹配
      11:11 Foo
      (11和
      Foo
      之间有两个空格)或
      22:22
      (没有空格)是的,我想我应该添加免责声明:p这个正则表达式假设两者之间正好有一个空格(根据提供的示例)。如果空格数未知或不同,将
      \s
      更改为
      \s*
      将允许这样做。请注意,在我回答自己之前,我投票否决了你的答案(否则我没有这样做)。我这样做是因为@mullek特别提到了之前关于@Eldarerat的一个答案,这是不正确的,因为它不匹配
      1:1
      :你的答案也不匹配(因此是不正确的)。但它不会匹配
      11:11 Foo
      (在
      11
      Foo
      之间的两个空格)或
      22:22
      (没有空格)是的,我想我应该加上这个免责声明:p这个正则表达式假设中间正好有一个空格(根据提供的示例)。如果空格的数量未知或不同,将
      \s
      更改为
      \s*
      将允许这样做。请注意,在我回答自己之前,我投票否决了你的答案(否则我没有这样做)。我这样做是因为@mullek特别提到了@Eldarerat的一个早期答案。这是不正确的,因为它不匹配
      1:1
      :您的答案也不匹配(因此是不正确的)。
      (\d+):(\d+)(?:\s(?!\s*Foo)|$)