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

时间:2016-04-02 11:35:58

标签: c# .net regex

使用这些数据示例:

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

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

3 个答案:

答案 0 :(得分:1)

假设“确切位置”意味着“第三位”,以下正则表达式将起作用:

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

在C#中,这可以与正则表达式构造函数和@“”字符串语法一起使用,这使得转义字符变得过时:

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

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

<强>解释

  • /捕获前导斜杠字符。

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

  • /捕获斜线字符

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

  • (?:[^/]*/)现在匹配“路径段”,例如“test /”,模式必须连续两次匹配。这就是为什么括号后跟量词{2}

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

  • 最后,数字后面可能会有不可比的字符(“tha path可以继续”):这由.(“匹配任何字符”)和量词{{1}指定},表示“任意数量的出现”。

注意:正则表达式有很多方言。这适用于C#正则表达式实现,但它也适用于许多其他人。

答案 1 :(得分:1)

正则表达式模式可以执行验证或推断位置定位验证。关键是根据之前遇到的字符串设置模式锚点 之前只需要数字。

对于你的情况,你有文字/ s然后文字然后文字-然后文字/然后文本....等。通过使用通用文本跟随文字锚点的那些模式,您可以要求特定的位置。

但是其他数字可能会欺骗其他模式(噪音本身),所以你似乎正在约会。以下内容将确保/{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的日期,而是给正则表达式解析器一个特定的类型提示,这将是一个日期,它位于第二十个世纪,19XX,或二十一世纪,20XX。因此,我将\d\d\d\d模式的前两个位置拼写成一个集合,其中1或2是第一个\d作为[12](1表示19xx模式,2表示20xx pattern)后面跟第二个数字是9或0 [90]。在现代计算机系统中,大多数日期将在这两个世纪之内;所以为什么不制作正则表达式呢。

答案 2 :(得分:0)

你的正则表达式将是:

\-(?:[^\/]+\/){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