以下是'/ aaa / bbb / ccc / ddd'或'/ aaa / zzz'的示例字符串
我希望得到一个正则表达式来获得每个块,比如
AAA
BBB
CCC
DDD
因此,我写了
Regex r = new Regex(@"(/[^/]*)*");
但它只能得到最后一场比赛,
/ DDD
我怎么能得到每个人,非常感谢。
更新我的问题:
我知道'分裂',只是为了好玩。
情况是我有一个字符串:
string s = @"ftp://127.0.0.1/TE ST.中文 空格CC/T # ES T.OK/# ##中文 测试##^#@!aaa.txt";
我想在/.../之间编码每个块(使用Uri.EscapeDataString(每个)) 我更喜欢使用Regex.Replace,这可能吗?
答案 0 :(得分:9)
你不需要(也不应该使用)正则表达式来做这么简单的事情。
string s = "/aaa/bbb/ccc/ddd";
var blocks = s.Split('/');
foreach(var block in blocks) {
Console.WriteLine(block);
}
输出:
aaa
bbb
ccc
ddd
编辑:哦,我明白你要做什么了。所以现在我们不想删除空条目,我们想说
string encoded = String.Join("/", blocks.Select(b => Uri.EscapeDataString(b)));
答案 1 :(得分:5)
在这种情况下,为什么不拆分/?
String[] split = "/aaa/bbb/ccc/ddd".split("/");
(注意,自从我编写C#以来已经有一段时间了,所以上面可能包含一两个错误,但是这个想法应该是明确的。)
答案 2 :(得分:1)
您的初始问题,使用Regex
:
Regex r = new Regex(@"(/[^/]*)");
var matches = r.Matches("/aaa/bbb/ccc/ddd");
foreach (var match in matches)
{
// ...
}
只需删除模式的尾随*
。
你的第二个问题:
Regex r = new Regex(@"/([^/]*)");
var result = r.Replace("1.1.1.1/aaa/bbb/ccc/test.ext", match => {
return string.Format("/{0}", Uri.EscapeDataString(match.Groups[1].Value));
});
答案 3 :(得分:1)
string s = @"ftp://127.0.0.1/# #/中 文.NET/###_%TRY 字符.txt";
s = ftpUrlPattern.Replace(s, new MatchEvaluator((match) => {
return "/" + Uri.EscapeDataString(match.Groups["tag"].Value);
}));
这样的模式:
static Regex ftpUrlPattern = new Regex(@"(?<!/)/(?<tag>[^/]+)");
答案 4 :(得分:0)
您可能正在调用匹配方法,并希望匹配。但是,你也可以使用split方法,只需拆分“/”(如果我理解你正确使用的话)。
替换:
public void Replace(string input)
{
Regex r = new Regex(@"(/[^/]*)");
var matchEval = new MatchEvaluator(Encode);
r.Replace(input, matchEval);
}
public string Encode(Match m)
{
//TODO: Encode the match
}
注意:我没有运行此方法,但方法应该是合理的。