Regex提取两个字符串之间的字符串列表

本文关键字:字符串 之间 列表 两个 提取 Regex | 更新日期: 2023-09-27 18:00:14

我有一个字符串,我想从中提取包含在两个字符串之间的字符串列表:['']。我尝试了在网上找到的几个正则表达式规则(特别是这个问题),但问题是正确地转义字符以使正则表达式正常工作。

如何提取两个字符串之间的字符串列表?我想做这样的事情:

List<string> TheListOfStrings = Regex.Matches(TheText, "....");

源代码是一个JavaScript块,我想从中提取对象键:对于instrance,TheObject['SomeProp'] = TheOtherObject['OtherProp'],因此列表应该包含SomePropOtherProp;按键可以在输入文本中多次出现。

Regex提取两个字符串之间的字符串列表

您的主要困难在于将方括号识别为分隔文本,而不是正则表达式的一部分。

string input = "a['bc']d['ef']gh']";
MatchCollection matches = Regex.Matches(input, @"'['(?<key>.*?)'']");
var listOfKeys = matches.Cast<Match>().Select(x => x.Groups["key"].Value);

真的很管用。

如果性能很重要,并且它将被多次运行,那么编译正则表达式将获得显著的胜利:

string input = "a['bc']d['ef']gh']";
Regex re = new Regex(@"'['(?<key>.*?)'']", RegexOptions.Compiled);
MatchCollection matches = re.Matches(input);
var listOfKeys = matches.Cast<Match>().Select(x => x.Groups["key"].Value);

使用通用模式

(?<=prefix)find(?=suffix)

它使用lookbehind和lookahead来查找模式,而不将它们包含在结果中。

其中
 nbsp前缀 为CCD_ 6;左括号被转义
 nbsp查找 nbsp nbsp;为CCD_ 7;任何字符的序列,但尽可能少
 nbsp后缀 是']

(?<='[').*?(?='])
List<string> TheListOfStrings = Regex.Matches(input, @"(?<='[').*?(?='])")
    .Cast<Match>()
    .Select(m => m.Value)
    .ToList();

如果重复调用同一个正则表达式,请创建它的可恢复实例,而不是调用静态方法。此外,如果您多次使用它,请考虑使用Compiled选项。它会跑得更快;然而,代价是初始化时间更长。

var regex = new Regex(@"(?<='[').*?(?='])", RegexOptions.Compiled);
while (loop_condition) {
    List<string> TheListOfStrings = regex.Matches(input)
        .Cast<Match>()
        .Select(m => m.Value)
        .ToList();
    ...
}

这可以满足您的需求:(?<='[")[^"]+(?="'])|(?<='[')[^']+(?=''])

对于a['bc']d['ef']gh'],返回bcef