Regex 如何在使用正则表达式时仅存在一个或不存在两个边界之间匹配字符串

Regex 如何在使用正则表达式时仅存在一个或不存在两个边界之间匹配字符串,regex,Regex,我想使用正则表达式匹配两个单词之间的任何字符串(“以下示例中的“Hello”和“byee”) 以下列表中的粗体区域应匹配: 你好,我喜欢你。再见 你好,你喜欢高尔夫球吗 我喜欢你。再见。待会儿见 根本不应该匹配的字符串示例包括(基本上我想将单词“Hello”和“再见”视为一种障碍): 再见 再见,你好吗 你好吗?你好 我试着使用(?使用 (?作为替代方案,没有公认的答案那么复杂,在重复边界词“Hello”和“再见”的情况下,匹配方式也有所不同,但可能更容易理解,因为它只是使用惰性/不情愿

我想使用正则表达式匹配两个单词之间的任何字符串(“以下示例中的“Hello”和“byee”)

以下列表中的粗体区域应匹配:

  • 你好,我喜欢你。再见
  • 你好,你喜欢高尔夫球吗
  • 我喜欢你。再见。待会儿见
根本不应该匹配的字符串示例包括(基本上我想将单词“Hello”和“再见”视为一种障碍):

  • 再见
  • 再见,你好吗
  • 你好吗?你好
我试着使用
(?使用


(?作为替代方案,没有公认的答案那么复杂,在重复边界词“Hello”和“再见”的情况下,匹配方式也有所不同,但可能更容易理解,因为它只是使用惰性/不情愿的量词
*?
进行匹配,而不是向后看或向前看:

^(?:*Hello)?(**?(:再见。*)$
(?:
开头的非捕获组确保组1符合您的需要。如果您不介意使用组2,则根本不需要使用非捕获组。请保持简单!然后正则表达式将显示:

^(.*Hello)?(.*)(再见。*)$
您可以测试第一个正则表达式


另见此。

为什么不简单地将
anystring
作为正则表达式?输入中唯一的其他文本可能是“Hello”或“再见”?即“Hello anystring world”不匹配?如果您愿意回顾一下问题中的示例,我想您可能会理解,这两个边界词之间可能有任何文本。关于边缘情况,仍然存在一些模糊性,但对我来说,有足够的信息来尝试回答问题。顺便说一句,链接的截图是also有助于解释OP的意图。正如我所说,规范不是100%清楚,但让我们试着帮助那个家伙,引导他下次写更好的问题,好吗?他显然是个初学者,甚至承认了。为你工作吗?@Toto,你应该写一个答案而不是评论。现在是其他人的answer和几乎相同的解决方案被接受,OP甚至没有给你任何信用。但我想在这里和现在这样做。:-)顺便说一句,我也有一个答案(更简单,并在某一点上使用懒惰/不情愿的量词)2天前已经准备好了,等待之前关闭的问题解锁,这花了一段时间,现在看到它已经得到了回答。这是人生!;-)谢谢,它似乎工作得很好!非常干净,易于理解。很高兴复制我的评论,不提任何问题就给出答案。
(?<=Hello|^)(?:(?!Hello|Goodbye).)+(?=Goodbye|$)
                         EXPLANATION
--------------------------------------------------------------------------------
  (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
    Hello                    'Hello'
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    ^                        the beginning of the string
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (1 or more times
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
      Hello                    'Hello'
--------------------------------------------------------------------------------
     |                        OR
--------------------------------------------------------------------------------
      Goodbye                  'Goodbye'
--------------------------------------------------------------------------------
    )                        end of look-ahead
--------------------------------------------------------------------------------
    .                        any character except \n
--------------------------------------------------------------------------------
  )+                       end of grouping
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    Goodbye                  'Goodbye'
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    $                        before an optional \n, and the end of
                             the string
--------------------------------------------------------------------------------
  )                        end of look-ahead