如何解析像'/ aaa / bbb / ccc / ddd'这样的字符串?

时间:2011-03-14 18:35:25

标签: c# regex

以下是'/ 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,这可能吗?

5 个答案:

答案 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
}

注意:我没有运行此方法,但方法应该是合理的。