我有一个字符串,我想从中提取两个字符串之间包含的字符串列表:['
和']
。我尝试了几个我在网上找到的正则表达式规则(特别是这个问题:Regular Expression to get a string between two strings in Javascript),但问题在于正确地转义字符以使正则表达式工作。
如何在两个字符串之间提取字符串列表?我想做这样的事情:
List<string> TheListOfStrings = Regex.Matches(TheText, "....");
源是一个javascript块,我想从中提取对象键:对于instrance,TheObject['SomeProp'] = TheOtherObject['OtherProp']
,因此列表应包含SomeProp
和OtherProp
;键可以在输入文本中多次出现。
感谢。
答案 0 :(得分:3)
你唯一的主要困难在于使方括号被识别为分隔文本而不是正则表达式的一部分。
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);
答案 1 :(得分:3)
使用一般模式
(?<=prefix)find(?=suffix)
它使用lookbehind和lookahead来查找模式而不在结果中包含它们。
其中
前缀是\['
;左括号被转义
find 是.*?
;任何字符的序列,但尽可能少。
后缀为']
(?<=\[').*?(?='])
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();
...
}
答案 2 :(得分:1)
这可能符合您的需求:(?<=\[")[^"]+(?="\])|(?<=\[')[^']+(?='\])
a['bc']d['ef']gh']
,会返回bc
和ef