我有一个遵循这种模式的字符串:
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/
答案 0 :(得分:1)
答案 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();