Regex 与此匹配的正则表达式

Regex 与此匹配的正则表达式,regex,Regex,我有一个字符串遵循以下模式: junk/FISH/junk/junk/NOTJUNK1-Z32/NOJUNK2/junk 垃圾文本表示我不感兴趣且不希望匹配的未知文本 FISH和所有前斜杠表示我不希望正则表达式匹配的已知文本 NOTJUNK1表示我确实关心并希望匹配的一些未知文本。-Z32将在NOTJUNK1之后出现,如图所示。我知道会有一个-Z,但我不知道后面的两位数。它甚至可能是一个数字。我还希望返回一个或两个数字的值作为匹配项(但我不希望使用-Z) 最后,NOTJUNK2还表示一些我确实

我有一个字符串遵循以下模式:

junk/FISH/junk/junk/NOTJUNK1-Z32/NOJUNK2/junk
垃圾
文本表示我不感兴趣且不希望匹配的未知文本

FISH
和所有前斜杠表示我不希望正则表达式匹配的已知文本

NOTJUNK1
表示我确实关心并希望匹配的一些未知文本。
-Z32
将在
NOTJUNK1
之后出现,如图所示。我知道会有一个
-Z
,但我不知道后面的两位数。它甚至可能是一个数字。我还希望返回一个或两个数字的值作为匹配项(但我不希望使用
-Z

最后,
NOTJUNK2
还表示一些我确实关心并希望返回的未知文本

我正在使用.NET库中的正则表达式

因此,使用上面的示例字符串,如果可能,我想要三个匹配项:

NOTJUNK1
32
NOTJUNK2
我最接近的是这个正则表达式:
(?您可以将此正则表达式与3个捕获组一起使用:

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

您可以像这样使用捕获组来匹配

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

说明:

  • (?:.*?\/){4}
    匹配
    不必要的数据和四个斜杠

  • (.*)
    NOTJUNK1
    匹配

  • -Z(\d{1,2})
    匹配
    一个
    两个
    数字后的
    -Z

  • (.*)
    NOJUNK2

NOTJUNK1
使用反向参考编号
\1
\2
32
(即
-Z
之后的编号),
\3
NOJUNK2
使用反向参考编号

这是你的建议试试这个

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();
string textMatch=“junk/FISH/junk/junk/NOTJUNK1-Z32/NOJUNK2/junk”;
正则表达式r=新正则表达式(@/(?.*?)-Z(?.*?/(?.*?)/”,RegexOptions.RightToLeft);
MatchCollection mcKVPs=r.Matches(textMatch);
var kvps=来自mcKVPs中的匹配m
其中mcKVPs!=null
其中mcKVPs.Count>0
选择新的
{
val1=m.组[“需求1”]值,
val2=m.组[“req2”]值,
val3=m.组[“需求3”]值
};
var kvp=kvps.FirstOrDefault();

怎么办?3个捕获的值是
NOTJUNK1
32
NOJUNK2
。难道不需要确保输入中有
/FISH/
吗?@anubhava:正如OP提到的,FISH和所有向前斜线表示我不希望正则表达式匹配的已知文本。因此
FISH
是不必要的。只有
/斜杠是必要的。如果我误解了,请告诉我。我想匹配的数据中不需要
/FISH/
,但它仍然需要存在于input@anubhava:是的,我在
{4}中计算了一下
@anubhava:需要FISH。在这种情况下,
right-toleft
不会给匹配带来任何优势。这是多余的。如果不从右向左放置,它将从左开始,匹配更多的“/”和out-of-req1=/FISH/junk/junk/notjunk1,这就是为什么你应该从
/FISH/
开始。
/FISH/[^/]*/[^/]*/([^/]*)-Z(\d+)/([^/]+)
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();