我有以下与XAML标记匹配的正则表达式:
的百分比抑制率^<>] *>
这将返回以下两行:
<Button x:Name="Button1" />
<Button x:Name="Button2" Content="foo" />
我想要做的是过滤掉其中包含“Content =”foo“”的标签。
有类似的例子,但在这种情况下,引号会让我感到沮丧。
有什么想法吗?
答案 0 :(得分:2)
/<[^>]*Content="foo".*?>/g
这意味着启动正则表达式(/
)并搜索<
被零或更多而不是 >
s([^>]*
)后跟Content="foo"
后跟零个或多个任意事件(.*
) un -greedily,然后是'&gt;'并结束正则表达式/
。
用javascipt编写,但可以轻松移植到其他语言中。
x = ['<Button x:Name="Button1" /><Button x:Name="Button2" Content="foo" /><Button x:Name="Button1" /><Button Content="foo" />']
console.log( x[0].match(/<[^>]*Content="foo".*?>/g) )
使用否定先行断言,detailed here
<((?!Content="foo")[^>])*>
这意味着匹配<
后跟零或更多不>
s([^>]*
),其中每个Content="foo"
前面都没有>
后跟{{1}} }。添加了括号以进行必要的分组。
但请记住 - 使用正则表达式替代XML解析会让堆栈溢出的人真的生你的气......所以最好匿名发布这样的问题。 ;)
答案 1 :(得分:1)
<([^<>](?!\sContent\s*=\s*("foo"|'foo')))*>
这......但请不要使用Regexes来解析XML。
我们使用[^<>]
捕获的每个字符,我们检查后面是否有一个空格和Content="foo"
。如果为true,则我们失败,因此捕获将回滚一个字符,正则表达式检查终止>
。
你必须点击一下才能使“正则表达式”被“激活”。
一些小注释:这个正则表达式是错误的,因为它试图解析XML,但忽略了这一点,它不会被SContent="foo"
(忽略)或Content='foo'
(捕获)或{{1 }}(忽略)或:Content='foo'
(catched)。如果您正在使用将Content = "foo"
视为与XML相同的空格字符列表的正则表达式解析器,这一点很清楚:-)否则一些“奇怪的,异类的”空格可能会破坏它。请记住将它与区分大小写的解析一起使用!