如何使用正则表达式查找 $ 和 /$ 之间的字符串

本文关键字:之间 字符串 正则表达式 查找 何使用 | 更新日期: 2023-09-27 18:32:08

>我有这样的字符串

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

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

预期的字符串应为

  1. ToBeFetched1

  2. ToBeFetched2

如何使用正则表达式查找 $ 和 /$ 之间的字符串

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

在这里,这肯定会起作用。

由于你有"打开"和"关闭"标记,正则表达式显然会围绕这种形式构建:

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

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

$(.*)$

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

'$(.*?)/'$

这形成了几乎很好的表达。但是,它将错误地再次匹配此类输入:

aaaaa/$bbbbb/$ccccc    ->    bbbbb

因为"头部标记"可以跳过斜杠并击中第一个美元符号,这是您最不想要的。因此,一些回顾在这里也很有用:

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

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

另请参阅 MSDN:正则表达式语法和运算符

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

使用字符串方法:

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,} 而不是 * 以确保没有空匹配项(对于字符串 lilke "$/$")

(?=/''$) - 积极的展望:它确保您的比赛在/$ 之前结束(/$ 不包括在匹配中)