用正则表达式清理xaml

时间:2013-06-27 15:39:33

标签: regex xaml visual-studio-2012 replace

我正在研究一些混乱的xaml。 Label有自己的nameTabIndex,这在我的情况下都是不必要的。采用以下示例Label元素

<Label Canvas.Left="20" Canvas.Top="40" x:Name="Page2Label15" Width="40" TabIndex="40">Great Label</Label>

如何在不针对误报的情况下使用Visual Studio 2012(或其他xaml编辑器)删除不需要的nameTabIndex属性?假阳性,我的意思是下面我需要保留的东西。

<TextBox Canvas.Left="20" Canvas.Top="40" x:Name="Page2Textbox15" Width="70" TabIndex="40">Great Label</TextBox>

似乎这应该是可能的,因为VS 2012查找和替换允许使用正则表达式。我无法让look around regular expressions正常工作。

我希望最终结果是:

<Label Canvas.Left="20" Canvas.Top="40" Width="40">Great Label</Label>

2 个答案:

答案 0 :(得分:1)

我不知道visual studio的正则表达式功能,但你可以试试这个搜索/替换:

search:  (<Label [^>]+?)(?:(?:x:Name|TabIndex)="[^"]*")([^>]*?)(?:(?:x:Name|TabIndex)="[^"]*")([^>]*>)
replace: $1$2$3      or      \1\2\3

我们的想法是捕获不是要删除的属性的标签标签的所有内容,然后仅替换为捕获的字符串。

编辑:看起来这种模式只有在存在两个丑陋的属性时才有效。 您只能使用以下属性删除案例:

search:  (<Label [^>]+?)(?:(?:x:Name|TabIndex)="[^"]*")
replace: $1

(或仅使用此图案两次)

注意:您可以使用notepad ++(采用最新版本)

来尝试这些模式

答案 1 :(得分:0)

Visual Studio使用非常特殊的正则表达式引擎。我不是在谈论.Net Framework,我的意思是实际的VS GUI。这很糟糕。

Visual Studio Regex Example

无论如何......尝试这样的事情......

{\<Label[^\>]*}(x\:Name|TabIndex)=:q
Replace with \1

你必须运行两次。

如果我读得正确,:q应匹配引号中的所有内容,包括引号。此外,您可以使用括号作为子表达式,但Capture-Groups实际上使用Curly-Braces,它通常是正常正则表达式中的量词。很奇怪。最后,Colon和GT / LT符号是特殊字符,所以我不得不逃避所有这些。