繁体   English   中英

在特定位置进行模式匹配以进行验证

[英]Pattern Match At Specific Location For Validation

通过这些数据示例:

/test -test/test/2016/April 
/test -test/test/2016

一个模式如何匹配,以便它可以确定数字2016是否位于此确切位置?

假设“精确位置”表示“第三位置”,则以下正则表达式将起作用:

/(?:[^/]*/){2}(\d{4}).*

在C#中,可以将其与Regex构造函数和@“”字符串语法一起使用,这使得转义字符已过时:

var rx = new Regex(@"/(?:[^/]*/){2}(\d{4}).*"); 

如果此正则表达式与字符串匹配,则将捕获年份的四位数字。

说明

  • /捕获前导斜杠字符。

  • [^/]*捕获不等于斜杠的任何字符序列。

  • /捕获一个斜杠字符

  • 现在,前面的两个代码部分被包装在非捕获括号内,并用?:指定为其中的前两个字符。

  • 现在有了(?:[^/]*/)匹配“ test /”之类的“路径段”,该模式必须连续精确匹配两次。 这就是为什么括号后面跟着量词{2}

  • 然后必须匹配实际的数字:它由连续的四个数字组成。 其表示如下: (\\d{4})其中\\ d表示“任何数字”,并且-再次-量词定义一行应有4个。

  • 最后,数字后面可能会有乱序字符(“ tha路径可以继续”):由来指定. (“匹配任意字符”)和量词* ,表示“任意数量的事件”。

注意:正则表达式有许多方言。 此方法适用于C#正则表达式实现,但是也应适用于其他许多情况。

正则表达式模式可以进行验证,也可以在推断位置定位验证时进行验证。 关键是根据仅在数字之前遇到的字符串设置模式

对于你的情况,你有文字/当时的文本,然后文字-然后字面/当时的文本....等。 通过使用普通文本遵循文字锚的那些模式,您可以要求一个特定的位置。

但是其他数字可能会欺骗其他模式(本身就是噪声),因此您似乎正在约会。 以下内容将确保/{date of 19XX or 20XX}/是该职位的唯一有效项目。

string pattern = @"
^            # Beginning of line (anchor)
/            # / anchor
[^-]+        # Anything not a dash.
-            # Anchor dash
[^/]+        # Anything not a /
/            # / anchor
[^/]+        # Anything not a /
/            # / anchor
[12][90]\d\d # Allow only a `date` field of 19XX or 20XX.
";

// IgnorePatternWhitespace *only* allows us to comment the pattern 
// and place it on multiple lines (space ignored)
// it does not affect processing of the data.
// Compiled tells the parser to hold the pattern compilation 
// in memory for future processing.
var validator = new Regex(pattern, RegexOptions.IgnorePatternWhitespace | 
                                   RegexOptions.Compiled);

validator.IsMatch("/ -test/test/2016/April"); // True
validator.IsMatch("/ -test/test/2016");       // True
validator.IsMatch("/ -test/test/1985/April"); // True
validator.IsMatch("/ -2017/test/1985/April"); // True
// Negative Tests
validator.IsMatch("/ -2017/test/WTF/April");       // False
validator.IsMatch("/jabberwocky/test/1985/April"); // False, no dash!
validator.IsMatch("////April");                    // false
validator.IsMatch("///2016/April");                // False because no text between `/`
validator.IsMatch("/ -test/test/ 2016/April");     // False because pattern 
                                                  // does not allow a space

模式注释

  • 我不是用\\d\\d\\d\\d查找日期,而是给正则表达式解析器指定了特定的锚点类型提示,即这将是位于20世纪,19XX或20世纪的日期。公元20世纪。 因此,我将\\d\\d\\d\\d模式的前两个位置拼写为一个集合,其中1或2是第一个\\d[12] (对于19xx模式为1或对于20xx模式为2)其次是第二位数字,可以是9或0 [90] 在现代计算机系统中,大多数日期都将在这两个世纪之内。 那么为什么不这样制作正则表达式呢?

您的正则表达式将是:

\-(?:[^\/]+\/){2}(\d+)

它将捕获出现在xx/xx/模式之后的数字,其中xx/是可调的。

例:

var s1 = "/test -test/test/2016/April";
var s2 = "/test -test/test/2016";

var rx = new Regex ("\\-(?:[^\\/]+\\/){2}(\\d+)");

var m1 = rx.Match(s1);
var m2 = rx.Match(s2);

if (m1.Success && m2.Success) {

    if (m1.Groups[1].Value == m2.Groups[1].Value) {
        Console.WriteLine ("s1 == s2");
    }
}

基于提供的输入字符串s1s2 ,它将打印:

s1 == s2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM