【问题标题】:Regex - check if a substring is not part of a pattern正则表达式 - 检查子字符串是否不是模式的一部分
【发布时间】:2016-05-03 18:53:26
【问题描述】:

我想检查给定的字符串,如果 TEST 出现在字符串中,那么它不在模式 ([]) 内。 对于以下示例字符串,正则表达式应返回 true

  • 测试
  • 这是我的([测试
  • 这是我的测试]) 2 号
  • ([bla]) 测试 ([bla])

对于以下示例字符串应该返回 false

  • 这是我的 ([TEST]) 哎呀
  • 这是我的 ([bla TEST bla])
  • 这是我的 ([TEST TEST])
  • 没有 tes* 字的字符串

谢谢

【问题讨论】:

  • ([TEST TEST]) 怎么样?匹配还是不匹配?
  • ([bla]) TEST ([bla]) 怎么样?
  • @svinja 正则表达式应该与 ([bla]) TEST ([bla]) 匹配,因为模式在 TEST 词之前关闭。很棒的收获。

标签: java regex string


【解决方案1】:

您可以使用这个前瞻正则表达式:

^(?!.*\(\[(?:(?!\(\[|\]\)).)*TEST(?:(?!\(\[|\]\)).)*\]\))(?=.*TEST).*
  • 如果([..TEST..]) 出现在该行中的任何位置,(?!..) 会否定匹配失败。
  • (?=.*TEST) 是肯定的前瞻,以确保该行包含 TEST

RegEx Demo

【讨论】:

  • ([bla]) [TEST]([bla]) 失败
  • 这是不正确的,因为 ([bla]) [TEST]([bla]) 在演示链接中是匹配项。
  • 对不起..这就是我的意思
  • 它说这是一场比赛.. 但据我所知,它不应该指出这是一场比赛
  • @Hugo 它应该是匹配的。非常感谢!
【解决方案2】:
/\[.*TEST.*\]/g

与您所要求的相反 (see Regex101 demo),只需执行“!”赛前

【讨论】:

  • 您可能希望稍微更改您的答案,因为该风格已被确立为 Java。从概念上讲,您的答案很好。
  • 你能解释一下'!'赛前?
  • @user1116377 反转指示是否存在匹配的布尔值。
猜你喜欢
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多