使用这些数据示例:
/test -test/test/2016/April
/test -test/test/2016
一种模式如何匹配,以便确定数字2016是否位于此确切位置?
答案 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");
}
}
根据提供的输入字符串s1
和s2
,它将打印:
s1 == s2