一个RegEx匹配这个

时间:2016-03-30 20:27:33

标签: regex

我有一个遵循这种模式的字符串:

junk/FISH/junk/junk/NOTJUNK1-Z32/NOJUNK2/junk

junk文字代表我不感兴趣且不想匹配的未知文字。

FISH以及所有正斜杠代表已知文本我不希望与RegEx匹配。

NOTJUNK1表示我关心并希望匹配的一些未知文字。 -Z32将在NOTJUNK1之后发生,如图所示。我知道会有-Z,但我不知道后面的两位数字。它甚至可能是一位数。我希望将一位或两位数值作为匹配项返回(但我不想要-Z)。

最后,NOTJUNK2也代表了一些我关心并希望返回的未知文字。

我在.NET库中使用RegEx。

所以,使用上面的示例字符串,如果可能的话,我想要三个匹配:

NOTJUNK1
32
NOTJUNK2

我最接近的是这个RegEx: (?<=FISH/.+/.+/).*?(?=-m[0-9]{1,2}/)?/

它返回两个匹配(接近但不是我想要的):

NOTJUNK1-Z32/
NOJUNK2/

4 个答案:

答案 0 :(得分:1)

您可以将此正则表达式与3个捕获组一起使用:

/FISH(?:/[^/]*)*?/([^/]+)-Z(\d{1,2})/([^/]+)

答案 1 :(得分:1)

您可以使用捕获群组来匹配。

正则表达式: (?:.*?\/){4}(.*)-Z(\d{1,2})\/(.*)\/

<强>解释

  • (?:.*?\/){4}匹配unnecessary数据和四个斜杠。

  • (.*)NOTJUNK1匹配。

  • -Z(\d{1,2})匹配one之后的two-Z位数。

  • (.*)NOJUNK2

  • 相匹配

\1使用反向引用号码NOTJUNK1\2使用32-Z之后的号码),\3 NOJUNK2 }。

<强> Regex101 Demo

答案 2 :(得分:1)

/FISH/[^/]*/[^/]*/([^/]*)-Z(\d+)/([^/]+)

以下是DEMO

答案 3 :(得分:0)

试试这个

string textMatch = "junk/FISH/junk/junk/NOTJUNK1-Z32/NOJUNK2/junk";
        Regex r = new Regex(@"/(?<req1>.*?)-Z(?<req2>.*?)/(?<req3>.*?)/", RegexOptions.RightToLeft);
        MatchCollection mcKVPs = r.Matches(textMatch);
        var kvps = from Match m in mcKVPs
                   where mcKVPs != null
                   where mcKVPs.Count > 0
                   select new
                   {
                       val1 = m.Groups["req1"].Value,
                       val2 = m.Groups["req2"].Value,
                       val3 = m.Groups["req3"].Value
                   };
        var kvp = kvps.FirstOrDefault();