【问题标题】:Negative lookbehind before an eager quantifier急切量词之前的负回顾
【发布时间】:2023-03-22 04:47:01
【问题描述】:

我需要重构一些PHP注解,我想用array<int, string>替换string[]

我已经尝试用这个 PCRE 正则表达式匹配适当的注释:

(?<!\$|>)\w+\[\]

但是不行,here's how the regex is matching:

最新的两行不应该匹配。有没有办法为此创建一个有效的正则表达式,或者我应该使用创建自定义脚本来执行此操作?

【问题讨论】:

  • 添加单词边界并添加-&gt;替代lookbehind,(?&lt;!\$|-&gt;)\b\w+\[\]
  • 后视必须是固定长度,所以我认为你不能将单个字符与 -&gt; 混合使用
  • 但是你可以把\b放在\w+之前,这样它就不会匹配部分单词
  • 否则(?&lt;![$&gt;])\b\w+\[]
  • @Barmar 这个 PCRE,不是 Python。见(?&lt;!\$|-&gt;)\b\w+\[\]demo

标签: php regex pcre


【解决方案1】:

你可以使用

\b(?<!\$|->)\w+\[]

请参阅PCRE regex demo

详情

  • \b - 字边界
  • (?&lt;!\$|-&gt;) - 如果在当前位置左侧紧邻 $-&gt;,则匹配失败
  • \w+ - 1+ 个单词字符。
  • \[] - [] 子字符串。

PHP demo:

$str = '/** @var string[] */
/** @return string[] */
* @param Company[]|null $companies

$icons[] = static::getIconDetailsFromLink($link);
$this->properties[] = $property;';

if (preg_match_all('/\b(?<!\$|->)\w+\[]/', $str, $matches)) {
  print_r($matches);
}

【讨论】:

  • 这是一个非常聪明的方法!谢谢你的帮助:)
猜你喜欢
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 2021-04-27
  • 1970-01-01
相关资源
最近更新 更多