[英]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");
}
}
基于提供的输入字符串s1
和s2
,它将打印:
s1 == s2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.