正则表达式,用于查找环视表达式

时间:2016-07-06 18:00:14

标签: regex regex-lookarounds lookaround

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

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. ST
  3. 我一直在Rubular.com

    测试我的正则表达式 从评论中添加


    我将在终端shell命令中使用正则表达式,我将在特定文件夹上运行该命令。 shell命令将对文件夹中的每个文件执行查找和替换,如此...

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

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

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

(?:class="|\G(?!^))(?:(?!st)[^"])*\Kst
  • (?:会打开non capturing group进行更改。
  • (?:class="|\G(?!^))第一部分是设置匹配开始的位置。 \G也会匹配字符串的开头。为防止这种情况,使用了否定lookahead (?!^)
  • (?:(?!st)[^"])*此部分用于匹配not "的任意数量的字符,并防止使用否定前瞻st <跳过(?!st) / LI>
  • \K resets报告的比赛开始。

Here is the demo at regex101。这可能是一个相当先进的模式。 SO有一个很好的regex faq