【问题标题】:regex find and replace for visual studio 2013-2015Visual Studio 2013-2015 的正则表达式查找和替换
【发布时间】:2016-09-15 19:26:58
【问题描述】:

我需要替换ff,但我必须保留内部内容,只用A类替换tagA元素。任何没有A类的TagA都应该保持不变。

<tagA class="a">
**random chars and line breaks occurrences**
</tagA>

<tagA class="a">
**random chars and line breaks occurrences**
**random chars and line breaks occurrences**
**random chars and line breaks occurrences**
</tagA>

<tagA> //this guy should be left untouched since he is not class A
**random chars and line breaks occurrences**
**random chars and line breaks occurrences**
**random chars and line breaks occurrences**
</tagA>

应该替换为

<newTag>
**retain inner content**
</newTag>

<newTag>
**retain inner content**
**retain inner content**
**retain inner content**
</newTag>

<tagA>//untouched
**random chars and line breaks occurrences**
**random chars and line breaks occurrences**
**random chars and line breaks occurrences**
</tagA>

【问题讨论】:

  • 所以基本上你想用newTag替换tagA class="a"
  • 包括其对应的结束标签 应该变成 但前提是开始标签有一个 class="a"
  • 你为什么要用&lt;/tagB&gt;关闭&lt;tagA class="a"&gt;
  • 哦,那是一个错误......对不起,我会替换它

标签: regex visual-studio replace


【解决方案1】:

搜索:

<\s*tagA\s+class\s*=\s*(["'])a\1\s*>((?:.|[\r\n])*?)<\s*/\s*tagA\s*>

替换为:

<newTag>$2</newTag>

替代的简化搜索模式:
如果您确定空格和使用的引号始终相同,您也可以使用以下搜索模式:

<tagA class="a">((?:.|[\r\n])*?)</tagA>

这种模式基本上省略了对可选间距的所有检查,并降低了在开始标记中匹配单引号和双引号的可能性。

替代替换:
如果您使用简化搜索模式,标签的内容将在第一个捕获组中,因此我们也需要对替换模式进行最低限度的更改:

<newTag>$1</newTag>

上面的表达式是用 Visual Studio 2015 测试的。


搜索模式说明:

&lt; 匹配字符“\s* 匹配任何数字(包括零)的任何类型的空格(换行符除外)
tagA 匹配标签名称“tagA”字面意思\s+ 匹配一个或多个任意类型的空白字符(换行符除外)
class 匹配键名“class”的字面意思
\s* 见上文
= 匹配字符“=”字面意思
\s* 见上文
(["']) 匹配双引号或单引号并将其存储为第一个捕获组
@ 987654334@ 匹配类值“a”字面意思
\1 匹配与第一个捕获组完全相同的字符(此处为双引号或单引号)
\s* 见上文
&gt; 匹配字符“>”字面意思
( 启动第二个捕获组
(?: 启动一个非捕获组
. 匹配除换行符以外的任何字符
@987654341 @ 匹配上的任一模式左边或右边(受封闭的非捕获组限制)
[\r\n] 匹配回车符或换行符,它们在 Windows 上共同形成换行符
) 关闭非捕获组*? 匹配(非捕获组)之前令牌的最短可能数字(包括零)
) 关闭第二个捕获组
&lt; 匹配字符“\s* 见上文
/ 匹配字符“/”字面意思
\s* 见上文
tagA 匹配标签名称“tagA”字面意思
\s* 见上文
&gt; 匹配字符“>”字面意思

替换模式说明:

&lt;newTag&gt; 按字面意思插入文本“
$2 按字面意思插入匹配的第二个捕获组的内容
&lt;/newTag&gt; 按字面意思插入文本“

【讨论】:

  • 如果这个答案解决了你的问题,请不要忘记接受它。谢谢。
  • 最后一个问题,如果是: (A(B)) (C) C 的 $number 是多少?
  • @MakotoLavan 捕获组按其打开大括号的顺序编号。这意味着AB 是 1,B 是 2,C 是 3。
【解决方案2】:

我不使用 VS,所以我不能真正了解它,但您尝试做的是匹配以下模式:&lt;tagA(.*?) class="a"&gt;(.*?)&lt;/tagA&gt;

然后将其替换为: &lt;newTag \1&gt;\2&lt;/newTag&gt;

由于我没有 VS,我无法测试正则表达式,但想法应该很清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2011-01-08
    • 2011-11-29
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多