正则表达式:选择特定字符和其他子字符串之前的所有内容,或者如果子字符串和字符都不存在则选择所有内容

问题描述 投票:0回答:3

我需要一个正则表达式,它可以选择

:
字符之前的所有内容,和/或子字符串
Hello
之前的所有内容。如果字符串中既没有
:
也没有
Hello
,我需要选择所有内容。

示例和预期输出:

  • "Let's go see Hello Dolly: A Classic Movie"
    -->
    "Let's go see "

    • 请注意,字符串可以同时包含子字符串
      "Hello"
      和字符
      ":"
      字符,并且应选择先出现者之前的所有内容。
  • "Let's go see: A Classic Movie, Hello Dolly"
    -->
    "Let's go see"

    • 请注意,字符串可以同时包含子字符串
      "Hello"
      和字符
      ":"
      字符,并且应选择先出现者之前的所有内容。
  • "Howdy"
    -->
    "Howdy"

    • 如果未找到
      "Hello"
      ":"
      ,则选择整个字符串。
  • "Well Hi, Hello My Friend"
    -->
    "Well Hi, "

    • 选择
      "Hello"
      之前的所有内容。
  • "My Favorite Pizza Place: NYC"
    -->
    "My Favorite Pizza Place"

    • 选择
      ":"
      之前的所有内容。
  • "Hello"
    -->
    ""

    • 选择
      "Hello"
      之前的所有内容,在本例中返回空字符串。

到目前为止,我已经找到了这个表达式,

(^[^:]+)
,它将返回
":"
字符之前的所有内容。

regex string character
3个回答
2
投票

这个正则表达式应该可以满足您的要求。它会查找要捕获的最少字符数 (

.*?
),后跟
:
Hello
或行尾 (
$
):

^(.*?)(?=:|Hello|$)

regex101 演示

如果您一次测试一个值并且不使用

g
标志,这将起作用。否则,字符串
"Hello"
将匹配两次,一次与行首的空字符串匹配,一次与
Hello
匹配。如果这是一个问题,您可以使用此正则表达式来防止这种情况发生,同时仍然捕获诸如
"Howdy"
:

之类的值
^(?:.*?)(?=Hello|:)|^(?!.*(Hello|:)).*$

regex101 演示


1
投票

^(?:(.*?)(?:(?:Hello)|:).*|.*)$

这个正则表达式应该可以解决问题 - 在这里尝试一下!

Breakdown

^(?:(.*?)(?:(?:Hello)|:).*|(.*))$

^(?:                           )$    force a full string match - this triggers the wildcard if one isn't found
                          |          select either of the two, but prefer the first
                           (.*)      capture any characters (when there's no : or Hello)
    (.*?)                            capture any characters, but as few as possible - this is the match you're looking for
                        .*           clean up any extra characters
         (?:           )             non capture group
                     |               choose either...
                      :              a colon
            (?:Hello)                or "Hello"
       

0
投票

也许,这个表达可能有点接近,也可能不是:

^([^:\r\n]*?)(?=Hello|:)|^(?!Hello).*$

演示

© www.soinside.com 2019 - 2024. All rights reserved.