Regexp与子字符串取决于前一个字符串



使用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部分)

最新更新