使用regexp,我想删除一个字符串前缀,该前缀以单词foo
开头,并且通过另一个模式可选::bar
。但是,我不想匹配包含:
:
- fooHELLO -匹配并捕获foo
- foo:barHELLO -匹配并捕获foo:bar
- foo:xHELLO - NO MATCH
那么我如何使:
可选,但如果它在那里,它必须后跟bar
?
我试过了:
^foo(:bar)?(?!:)
它几乎可以工作,但是由于可选的接受字符串和可选的禁止字符串之间没有关系,所以最后一种情况不起作用:
fooHELLO -> ✅ HELLO
foo:barHELLO -> ✅ HELLO
foo:XHELLO _> ✅ no match
foo:bar:HELLO -> ❌ no match, but should be :HELLO
如果我使用逻辑or
:
^foo((:bar)|(?:[^:]))
那么第一个就失败了:
fooHELLO -> ELLO ❌ H was consumed
foo:barHELLO -> ✅ HELLO
foo:XHELLO _> ✅ no match
foo:bar:HELLO -> ✅ :HELLO
那么我怎么能使一个regexp "要么foo
后面跟着:bar
,然后匹配foo:bar
,或者foo
后面跟着一些不以:
开始的东西,然后匹配foo
",这样它就可以与JavaScriptString.replace(pattern, '')
函数一起使用,以摆脱前缀?
试试:https://regex101.com/r/gJ7PiJ/1
Regex:(?<=foo:bar|foo(?!:)).*$
粗略的人工翻译:看后面看到foo:bar或foo后面没有冒号,然后从那里捕获直到末尾
注意这将捕获foo:bar/foo模式之后的所有内容(即示例中的HELLO部分)