【问题标题】:Negative Lookahead pattern which matches no matter where it is in a string负前瞻模式,无论它在字符串中的什么位置都匹配
【发布时间】:2013-05-27 02:01:28
【问题描述】:

这与Ignoring case for a whole pattern of strings 相关联,但这是一个不同的问题。

我想知道是否有忽略字符串的开头,或者负前瞻是否只能从左到右工作并且需要一个起点?我尝试过的每件事似乎总能找到匹配项。

我当前使用的模式是

(?i)^(?!pack ?station|paket ?station).*$

这适用于“packstation foo bar”,但如果我想匹配“foo packstation bar”,则它不起作用。

字符串最多只能是 26 个字符,如果它包含以下字符串,那么我想匹配它。

  • packstation - (packstation | Packstation | PACKSTATION)
  • 打包站-(打包站|打包站|打包站|打包站|打包站)
  • paketstation - ( paketstation | Paketstation | PAKETSTATION )
  • 帕吉特站-(帕吉特站|帕吉特站|帕吉特站|帕吉特站|帕吉特站)

【问题讨论】:

  • 如果要匹配,为什么要negative前瞻?
  • 也许我错了,但如果不允许包含匹配的模式,我认为您使用了否定词?我的问题是我只想传递一个模式而不做任何其他事情。此模式只接受不包含上述字符串的字符串。

标签: java regex


【解决方案1】:

这就是你要找的东西

(?i)^(?=.*(pack ?station|paket ?station)).{1,26}$

您在前瞻中缺少.*

另外,如果你想匹配它,使用positive lookahead会更清晰..

【讨论】:

  • 我有一个问题。它有效,但为什么呢?是不是因为前瞻中的 .* 是贪婪的,试图消耗整个字符串,然后不断丢弃一个字符并尝试在每个可能的点匹配前瞻?
  • @Patashu 和 .* 它会吃掉字符串中的每个字符。也就是说,它会走到最后。然后它会逐个回溯以匹配 (pack(et)? ?station)..
  • 如果表示匹配则不消耗输入
  • (目前,这不排除Paketstation。您可以将c 设为可选,但会以Pakstation 等误报匹配为代价,或者重新引入原始替代项。
  • @TimPietzcker 是的..确实先生..你是对的..编辑了答案..谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 2021-11-07
  • 2020-06-11
  • 1970-01-01
相关资源
最近更新 更多