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();