正则表达式字符串检索

时间:2013-03-06 21:22:37

标签: c# regex

我有这个字符串,我需要从字符串的最末端提取ID(IgnoreCase为true):

字符串:

[Test].Test Stuff].[Class].&[002 - My Hat]&[002-01 - Big Hat]

我想要提取的内容:

002-01

到目前为止,我所拥有的是:

(?<=&\[).+(?=\s\-\s.+\])

但我得到了这个:

002 - My Hat]&[002-01

5 个答案:

答案 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