与正则表达式部分匹配

Lou*_*uis 4 c# regex wpf character special-characters

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

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

但是,当模式变得更加复杂和具体时,针对它测试单个字符将始终失败。

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

这些值会成功:

  • A B C D
  • A B C D
  • 1234
  • A23e

该表达式显然只需要字母数字字符。我想要一种给定表达式将拒绝特殊字符的方法,比如“%”,但接受“a”,因为“a”在[a-zA-Z0-9]. 唯一的问题是不会满足的特定长度。

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

Luc*_*ski 5

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

来自 PCRE 文档:

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

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

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

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

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


但是 PCRE 是一个 C 库...所以我为 .NET构建了一个PCRE 包装器

自述文件中的用法示例:

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

不过要注意一点:包装器目前是 v0.3,使用 PCRE v8.36,但最近发布了 PCRE v10.0(带有新的 API),因此预计PCRE.NET v0.4的 API 会发生一些重大变化. 行为应该保持不变。

而且,您应该了解.NET 和 PCRE 正则表达式之间的差异。不过,对于大多数情况,这应该不是问题。