从XAML传递的正则表达式无法匹配完全相同的字符串是什么原因?
问题根因
这个问题核心是XAML属性的转义规则和正则转义规则叠加导致的实际正则表达式和预期不一致,主要有两个易错点:
- XAML的属性转义不识别反斜杠,你在
ConverterParameter里写的\:、\(这类带反斜杠的内容,XAML解析时会直接保留反斜杠,不会像C#字符串那样把反斜杠当作转义符处理。也就是说你传给转换器的参数实际是Trip\: I> \(50\-1\),最终生成的正则规则会要求匹配Trip后面紧跟一个反斜杠再加冒号,和你测试用的Trip:完全不匹配,自然返回false。 - 你调试时看到的正则解析结果
Trip: I> (50-1)大概率是调试工具的编码展示问题:XAML先把>解析为字符>,所以你实际的正则里对应的是I\>,而你写的测试字符串如果是"Trip: I> (50-1)",那么这个字符串里的>是四个字面量字符,和正则要匹配的>字符不一致,也会导致匹配失败。
修复方案
- 调整XAML里的正则写法,给所有正则转义用的反斜杠再加一个反斜杠,确保XAML解析后C#能拿到正确的单斜杠转义符:
<DataTrigger Binding="{Binding ActiveAlarms, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tagsviews:Indicator}}, Converter={StaticResource ActiveAlarmsConverter}, ConverterParameter='Trip\\: I\\> \\(50\\-1\\)'}" Value="True"> <Setter TargetName="FaultLine" Property="Visibility" Value="Visible"/> </DataTrigger>
- 测试匹配时使用和实际场景完全一致的字符串,如果正则匹配的是
>字符,测试代码要改成:
if (searchRegex.IsMatch("Trip: I> (50-1)")) { return true; }
- 如果你的匹配规则就是固定字符串,不需要用到正则的特殊语法,可以直接在转换器里用
string.Contains代替正则匹配,避免多重转义的问题。
内容的提问来源于stack exchange,提问作者bigboy
相关产品推荐
相关产品推荐

