0

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

细绳:

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

我要提取的内容:

002-01

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

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

但我得到了这个:

002 - My Hat]&[002-01
4

5 回答 5

3

您需要在末尾添加一个输入结束锚$,并禁止匹配[]作为非空.+序列的一部分,如下所示:

(?<=&\[)([^\[\]]+)(?=\s\-\s[^\[\]]+\]$)
//       ^^^^^^^           ^^^^^^^   ^
//          |                 |      |
//        No square brackets here    |
//                                   |
//                        End of input marker here
于 2013-03-06T21:25:22.357 回答
1

更简单的版本:

(?<=\]\&\[)(\d+-\d+)

解释:

?<=做一个积极的 Lookbehind。这意味着它将匹配 () 大括号内的字符,但不返回它们。我使用的这个 Positive Lookbehind 中的字符是]&[

然后它匹配\d+这意味着 1 到无穷大的连续数字,后跟一个连字符,然后是-一个\d+

此外,http://regex101.com/r/iW4cP1用于玩同样的游戏。

于 2013-03-06T21:45:32.823 回答
0

如果字符串的格式始终相同,请]&[在正则表达式中使用最后一个,如下所示:

\]&\[([\d-]*).*

如果数字总是跟随 ]&[,那应该可以解决问题

否则我认为这样的事情应该可以解决问题:

\[([\d-]+)[^\[]*\]$

所以后面跟着任何非[字符一直到最后一个]的一组数字

于 2013-03-06T21:31:19.197 回答
0

您的正则表达式实际上非常接近,如果您添加 ] 括号,您应该匹配您想要的。

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

如果数字格式始终相同,则您实际上并不需要前瞻,而是可以匹配格式。

(?<=\]&\[)\d{3}-\d{2}
于 2013-03-06T21:35:53.587 回答
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
于 2013-03-06T21:50:03.877 回答