用于在环视表达式中查找所有出现的单词的正则表达式

Regular Expression to find all occurrences of a word within a lookaround expression

我需要在任何 html 页面的任何 class 声明中找到所有出现的 "st",例如:

class="st0 st1 st2", class="st3 st45", class="st678"

我在 class 声明中说是因为整个文档中可能还有其他 "st" 的出现,我不想每次都更改。

我的最终目标是查找和替换。我已经为此编写了逻辑,但我只需要弄清楚如何从字符串中分离出 "st"。

我尝试了一些不同的环视表达式,但我似乎无法匹配每一个出现的地方。以下是我一直在尝试的一些示例。

此表达式获取 'class="' 和 '"' 之间的所有内容:

正则表达式:

(?<=class=").*(?=")

测试刺:

class="st10 st11"

匹配结果:

"st10 st11"

这是我试过的另一个:

正则表达式:

(?<=class=")((st)\d*\s*)*(?=")

测试刺:

class="st10 st11"

匹配结果:

"st10 st11"

匹配组:

  1. st11
  2. st

我一直在 Rubular.com

测试我的正则表达式

从评论中添加
我将在终端 shell 命令中使用正则表达式,我将在特定文件夹上 运行。 shell 命令将查找并替换文件夹中的每个文件,如下所示...

perl -pi -w -e 's/st/stx/g;' ~/Desktop/svg_find_replace/*.svg.

如有任何帮助,我们将不胜感激。

您可以使用基于 \G to chain matches 的正则表达式。

(?:class="|\G(?!^))(?:(?!st)[^"])*\Kst
  • (?:打开一个non capturing group进行交替。
  • (?:class="|\G(?!^)) 第一部分是设置比赛开始的地方。 \G 也将匹配字符串的开头。为防止这种情况,使用负值 lookahead (?!^)
  • (?:(?!st)[^"])* 这部分是为了匹配任意数量的 not " 的字符,并防止通过使用否定前瞻 (?!st) 来跳过 st ]
  • \K resets 报告匹配的开始。

Here is the demo at regex101. It is probably a rather advanced pattern. SO has a nice regex faq.