1

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

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

我在类声明中说是因为整个文档中可能还会出现其他“st”,我不想更改每一个出现的地方。

我的最终目标是查找和替换。我为此编写了逻辑,但我只需要弄清楚如何将“st”与字符串隔离开来。

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

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

正则表达式:

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

测试刺:

class="st10 st11"

匹配结果:

"st10 st11"

这是我尝试的另一个:

正则表达式:

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

测试刺:

class="st10 st11"

匹配结果:

"st10 st11"

匹配组:

  1. st11
  2. 英石

我一直在Rubular.com测试我的正则表达式

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

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

任何帮助将非常感激。

4

1 回答 1

1

您可以使用基于\G链匹配的正则表达式。

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

这是 regex101 的演示。这可能是一种相当高级的模式。SO有一个很好的正则表达式常见问题解答

于 2016-07-06T19:55:12.560 回答