我有这个字符串,我需要从字符串的最后提取 ID(IgnoreCase 为真):
细绳:
[Test].Test Stuff].[Class].&[002 - My Hat]&[002-01 - Big Hat]
我要提取的内容:
002-01
到目前为止,我所拥有的是:
(?<=&\[).+(?=\s\-\s.+\])
但我得到了这个:
002 - My Hat]&[002-01
您需要在末尾添加一个输入结束锚$
,并禁止匹配[]
作为非空.+
序列的一部分,如下所示:
(?<=&\[)([^\[\]]+)(?=\s\-\s[^\[\]]+\]$)
// ^^^^^^^ ^^^^^^^ ^
// | | |
// No square brackets here |
// |
// End of input marker here
更简单的版本:
(?<=\]\&\[)(\d+-\d+)
解释:
?<=
做一个积极的 Lookbehind。这意味着它将匹配 () 大括号内的字符,但不返回它们。我使用的这个 Positive Lookbehind 中的字符是]&[
然后它匹配\d+
这意味着 1 到无穷大的连续数字,后跟一个连字符,然后是-
一个\d+
此外,http://regex101.com/r/iW4cP1用于玩同样的游戏。
如果字符串的格式始终相同,请]&[
在正则表达式中使用最后一个,如下所示:
\]&\[([\d-]*).*
如果数字总是跟随 ]&[,那应该可以解决问题
否则我认为这样的事情应该可以解决问题:
\[([\d-]+)[^\[]*\]$
所以后面跟着任何非[字符一直到最后一个]的一组数字
您的正则表达式实际上非常接近,如果您添加 ] 括号,您应该匹配您想要的。
(?<=\]&\[).+(?=\s\-\s.+\])
如果数字格式始终相同,则您实际上并不需要前瞻,而是可以匹配格式。
(?<=\]&\[)\d{3}-\d{2}
如果您知道它位于字符串的末尾,为什么不使用该提示通知处理器呢?这是使用从右到左的正则表达式选项:
string data = @"[Test].Test Stuff].[Class].&[002 - My Hat]&[002-01 - Big Hat]";
string pattern = @"(?:\[)(?<Data>\d+-\d+)";
Console.WriteLine(Regex.Match(data, pattern, RegexOptions.RightToLeft).Groups["Data"].Value); // 002-01