与正则表达式的部分匹配

时间:2015-02-11 22:02:28

标签: c# regex wpf character special-characters

当正则表达式需要特定数量的char时,有没有办法确定单个char是否有效?

我有一个WPF自定义键盘,并希望根据正则表达式调整每个键的可用性。 当表达式相当简单并且不期望字符的特定顺序或特定长度来满足模式时,这将很有效。

但是,当模式变得更复杂和特定时,针对它测试单个char将始终失败。

例如,给定正则表达式[a-zA-Z0-9]{4}

这些值将成功:

  • ABCD
  • abcd
  • 1234
  • A23e

表达清楚地预期只有字母数字字符。 我想要一个方法,给定表达式将拒绝特殊字符,例如“%”,但在[a-zA-Z0-9]中接受“a”作为“a”是可接受的。唯一的问题是不满足的具体长度。

我目前正在使用Regex.IsMatch。我想我正在寻找部分匹配测试方法。

1 个答案:

答案 0 :(得分:3)

当然,你可以,但不幸的是没有使用内置的正则表达式引擎。您可以使用PCRE代替,它提供您要求的部分匹配功能。

来自PCRE文档:

  

在正常使用PCRE时,如果传递给匹配函数的主题字符串尽可能匹配,但是太短而不匹配整个模式,则返回PCRE_ERROR_NOMATCH。在某些情况下,将此案例与其他无法匹配的案例区分开来可能会有所帮助。

     

例如,考虑一个应用程序,其中需要人员为具有特定格式要求的字段键入数据。示例可能是ddmmmyy形式的日期,由此模式定义:

 ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$
     

如果应用程序逐个查看用户的击键,并且可以检查到目前为止输入的内容是否有效,则可以在出现错误时立即发出错误,通过哔哔声和例如,没有反映已输入的字符。这种即时反馈可能是比在输入整个字符串之前延迟的检查更好的用户界面。当主题字符串很长并且不能一次全部可用时,部分匹配也很有用。

     

PCRE通过PCRE_PARTIAL_SOFTPCRE_PARTIAL_HARD选项支持部分匹配,可以在调用任何匹配函数时设置。为了向后兼容,PCRE_PARTIALPCRE_PARTIAL_SOFT的同义词。两个选项之间的本质区别在于,部分匹配是否优先于替代完全匹配,尽管两种匹配函数的细节不同。如果同时设置了两个选项,则PCRE_PARTIAL_HARD优先。


但是PCRE是一个C库...所以我已经构建了PCRE wrapper for .NET

来自the readme的使用示例:

var regex = new PcreRegex(@"(?<=abc)123");
var match = regex.Match("xyzabc12", PcreMatchOptions.PartialSoft);
// result: match.IsPartialMatch == true

虽然有点谨慎:包装器目前处于v0.3,使用PCRE v8.36但最近发布了PCRE v10.0(使用新的API),所以期待API中的一些重大更改

此外,您应该了解.NET和PCRE正则表达式之间的the differences。对于大多数情况,这应该不是问题。