如何使用Regex在$和/ $之间找到字符串

时间:2013-09-19 08:53:55

标签: c# .net text-parsing

我有一个像这样的字符串

ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH

如何检索$/$之间的字符串?

预期字符串应为

  1. ToBeFetched1

  2. ToBeFetched2

4 个答案:

答案 0 :(得分:2)

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

这将是肯定的。

答案 1 :(得分:2)

由于你有“打开”和“关闭”标记,所以正则表达式显然是围绕这种形式构建的:

[head-marker: $] [the content you are interested in: anything] [tail-marker: /$]

所以,添加括号以形成捕获组:

$(.*)$

然而,这里有两个问题:*表达式是贪婪的(你不希望它是,因为你希望所有最小的匹配成为可能) - 所以它必须被削弱,而且$是正则表达式中的特殊字符,因此必须进行转义:

\$(.*?)/\$

这形成了几乎很好的表达。然而,它会错误地匹配这样的输入:

aaaaa/$bbbbb/$ccccc    ->    bbbbb

因为“头标记”可以跳过斜线并击中第一个美元符号,这很可能是你不想要的。因此,一些看起来也很有用:

(?!</)\$(.*?)/\$

?!<XXXX仅在XXXX不在之前潜在匹配时指示匹配。

另见MSDN: Regex syntax and operators

编辑:实际上Arie的建议更简单,因为它不使用捕获组。但请注意小的差异:Arie的示例显示fobids数据包含美元符号,因此ABCD$-$ToBeFe$tched1/$-将导致tched1而不是ToBeFe$tched1。如果您需要后者,只需更改内部[^$]部分即可。思考并选择你真正需要的东西!

答案 2 :(得分:1)

使用字符串方法:

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

答案 3 :(得分:1)

  

(小于?= \ $)[^ $] {1,}(?= / \ $)

(?&lt; = \ $) - 积极的反馈:确保您的匹配在 $ 之后立即启动( $ 不包含在匹配)

[^ $] {1,} - 匹配 $ 以外的字符; {1,} 代替 * 以确保不会出现空匹配(对于字符串lilke“ $ / $ ”)

(?= / \ $) - 积极前瞻:确保您的匹配在 / $ 之前结束( / $ 不包括在内比赛)