我有这个字符串,我需要从字符串的最末端提取ID(IgnoreCase为true):
字符串:
[Test].Test Stuff].[Class].&[002 - My Hat]&[002-01 - Big Hat]
我想要提取的内容:
002-01
到目前为止,我所拥有的是:
(?<=&\[).+(?=\s\-\s.+\])
但我得到了这个:
002 - My Hat]&[002-01
答案 0 :(得分:3)
您需要在结尾处添加输入结束锚$
,并禁止将[]
作为非空.+
序列的一部分进行匹配,如下所示:< / p>
(?<=&\[)([^\[\]]+)(?=\s\-\s[^\[\]]+\]$)
// ^^^^^^^ ^^^^^^^ ^
// | | |
// No square brackets here |
// |
// End of input marker here
答案 1 :(得分:1)
更简单的版本:
(?<=\]\&\[)(\d+-\d+)
说明:
?<=
执行Positive Lookbehind。这意味着它将匹配()括号内的字符,但不返回它们。我使用的这个Positive Lookbehind中的角色是]&[
然后它匹配\d+
,这意味着1到无穷大连续数字,后跟连字符-
和\d+
此外,http://regex101.com/r/iW4cP1也可以使用相同的内容。
答案 2 :(得分:0)
如果字符串的格式始终相同,请使用正则表达式中的最后]&[
,如下所示:
\]&\[([\d-]*).*
如果数字始终跟在&amp; [
之后,那应该可以解决问题否则我觉得这样的事情可以解决问题:
\[([\d-]+)[^\[]*\]$
所以一组数字后跟任何非[字符一直到最后一个]
答案 3 :(得分:0)
你的正则表达式实际上非常接近,如果你添加]括号,你应该匹配你想要的。
(?<=\]&\[).+(?=\s\-\s.+\])
如果数字格式相同,您实际上并不需要前瞻,而是可以匹配格式。
(?<=\]&\[)\d{3}-\d{2}
答案 4 :(得分:0)
如果您知道它位于字符串的末尾,为什么不使用该提示通知处理器?这是使用从右到左的正则表达式选项:
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