我需要一个正则表达式,它可以选择
:
字符之前的所有内容,和/或子字符串 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"
之前的所有内容,在本例中返回空字符串。到目前为止,我已经找到了这个表达式,
(^[^:]+)
,它将返回 ":"
字符之前的所有内容。
这个正则表达式应该可以满足您的要求。它会查找要捕获的最少字符数 (
.*?
),后跟 :
、Hello
或行尾 ($
):
^(.*?)(?=:|Hello|$)
如果您一次测试一个值并且不使用
g
标志,这将起作用。否则,字符串 "Hello"
将匹配两次,一次与行首的空字符串匹配,一次与 Hello
匹配。如果这是一个问题,您可以使用此正则表达式来防止这种情况发生,同时仍然捕获诸如 "Howdy"
: 之类的值
^(?:.*?)(?=Hello|:)|^(?!.*(Hello|:)).*$
^(?:(.*?)(?:(?: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"