我有一个这样的字符串
ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH
如何检索和之间的$
字符串/$
?
预期的字符串应该是
ToBeFetched1
ToBeFetched2
我有一个这样的字符串
ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH
如何检索和之间的$
字符串/$
?
预期的字符串应该是
ToBeFetched1
ToBeFetched2
由于您有“打开”和“关闭”标记,正则表达式显然是围绕这种形式构建的:
[head-marker: $] [the content you are interested in: anything] [tail-marker: /$]
因此,添加括号以形成捕获组:
$(.*)$
然而,这里有两个问题:*
表达式是贪婪的(你不希望它是贪婪的,因为你想要所有最小的匹配) - 所以它必须被削弱,而且$
是正则表达式中的一个特殊字符,所以它必须被转义:
\$(.*?)/\$
这形成了几乎很好的表达。然而,它会错误地匹配此类输入:
aaaaa/$bbbbb/$ccccc -> bbbbb
因为“头部标记”可以跳过斜线并击中第一个美元符号,这很可能是您不想要的。因此,一些后视在这里也很有用:
(?!</)\$(.*?)/\$
仅当?!<XXXX
XXXX 不在潜在匹配之前时才匹配。
另请参阅MSDN:正则表达式语法和运算符
编辑:实际上 Arie 的建议要简单得多,因为它不使用捕获组。但请注意细微差别:Arie 的示例明确禁止数据包含美元符号,因此ABCD$-$ToBeFe$tched1/$-
将导致tched1
not ToBeFe$tched1
。如果您需要后者,只需更改内部[^$]
部分。思考并选择你真正需要的东西!
Regex r = new Regex(Regex.Escape("-$") + "(.*?)" + Regex.Escape(@"/$"));
MatchCollection matches = r.Matches("ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH");
foreach (Match match in matches)
{
Console.WriteLine(match.Groups[1].Value);
}
在这里,这肯定会起作用。
使用字符串方法:
string s ="ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH";
var results = s.Split('-')
.Where(x=> x.StartsWith("$") && x.EndsWith("/$"))
.Select(y=> y.Substring(1,y.Length - 3));
//Console.WriteLine("string1: {0}, string2:{1}",results.ToArray());
(?<=\$)[^$]{1,}(?=/\$)
(?<=\$) - 积极的向后看:它确保你的比赛在$之后立即开始($不包括在比赛中)
[^$]{1,} - 匹配$以外的字符;{1,}而不是*以确保没有空匹配项(对于类似“ $/$ ”的字符串)
(?=/\$) - 积极的前瞻:它确保你的比赛在/$之前结束(/$不包括在比赛中)