【问题标题】:Regex pattern alternative for (negative) lookbehinds of arbitrary, non-zero length [duplicate]任意、非零长度的(负)lookbehinds的正则表达式模式替代[重复]
【发布时间】:2020-07-03 18:53:20
【问题描述】:

我缺乏使用正则表达式的经验,需要帮助解决这个问题:

目标:创建一个匹配任意字符串中的“renal”或“kidney”的正则表达式模式,前提是它不包含“carcinoma”。

示例字符串:

  1. “肾细胞癌”
  2. “肾透明细胞癌”
  3. “慢性肾功能不全”

预期输出: 正则表达式模式与前两个字符串中的“renal”和“kidney”不匹配;它确实匹配第三个字符串中的“renal”(因为没有“carcinoma”)。

我的尝试: (?here 和here,lookbehinds 被限制为基本上非零长度;正则表达式不能向后应用任意长度。

那么什么正则表达式模式可以解决问题?我想要一个模式来保持关注(或“锚定”在)“肾”和“肾”而不是“癌”。

【问题讨论】:

  • 您可以从字符串 ^(?!.*\bcarcinoma\b).*\b(renal|kidney)\b.* regex101.com/r/1FVdio/1 的开头使用负前瞻
  • 这行得通,非常感谢!让我确保我理解它:它锚定在字符串的开头(带有 ^);对癌进行非零长度的负前瞻,然后包括肾或肾。
  • 是的,如果“包含”是指匹配前面(从字符串开头)零个或多个字符的“肾”或“肾”。如果没有锚,对于字符串"my kidney is great",负前瞻将得到满足,之后正则表达式的指针将位于"kidney""k""i" 之间,因为从该位置"kidney" 不会出现在其余的字符串。因此需要锚点。
  • 一般来说,要断言字符串 包含特定字符串,就像这里一样,使用带有锚点 ^ 的否定前瞻(或者可能是 \A,具体取决于关于语言和应用程序)。要断言字符串 does 包含特定字符串,请使用具有相同锚点的正向前瞻。

标签: regex


【解决方案1】:

您尝试的模式(?<!carcinoma).*(kidney|renal) 断言直接在左侧的不是carcinoma,这从字符串的开头就为真。

然后它将匹配任何字符 0+ 次,直到字符串结束并尝试回溯以适合肾或肾。


不使用(?<!carcinoma),而是使用^(?!.*\bcarcinoma\b) 从字符串的开头断言bcarcinoma 不存在于右侧。

然后匹配字符串中的“肾”或“肾”这个词。

^(?!.*\bcarcinoma\b).*\b(renal|kidney)\b.*

Regex demo

【讨论】:

  • 好的,非常感谢!
猜你喜欢
  • 2021-01-26
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
相关资源
最近更新 更多