用于取消内部选择的正则表达式

时间:2011-04-04 22:39:52

标签: c# .net regex c#-4.0 desktop-application

一个例子,

我有一个包含让我们说的字符串:

  

function main {

     

// TODO print'hello {cmd get   世界}世界{nice}!的asdads

     

你好'l {o} l'。'asd'

     

}

如何只选择在''内且不在{}内的单词。此示例将返回输出:

匹配1:

  

'你好{

     

}世界{

     

}!“

匹配2:

  

“L {

     

} L'

匹配3:

  

'ASD'

非常感谢!

3 个答案:

答案 0 :(得分:0)

MatchCollection matches = Regex.Matches(myInput, "'[^']+'", RegexOptions.SingleLine | RegexOptions.MultiLine);

现在的诀窍是只选择匹配的偶数索引。

答案 1 :(得分:0)

如果您只想分别使用所有六个匹配的字符串,我会使用['}].*?['{],但您似乎需要三个字符串,在这种情况下,我会首先将}[^']*?{替换为}{,然后匹配{ {1}}。

答案 2 :(得分:0)

这应该分两步让你得到你想要的东西:

IEnumerable<string[]> captures = 
    // Get the 'single quoted' tokens
    Regex.Matches(s, "'[^']*'").Cast<Match>() 
    // Split each token by { blocks }, but keep the curly braces.
    .Select(quoteMatch => Regex.Split(quoteMatch.Value, @"(?<=\{)[^{}]*(?=\})"))
    .ToArray();

结果是一组字符串数组 - 每个集合都是“匹配”,每个字符串都是“组”。

可以在单个.Net正则表达式中完成所有这些操作,但它并不漂亮,而且更难以使用。这是一个有效的解决方案:http://ideone.com/qaceF,但是当有更简单的替代方案时,我认为这不是一个正确的答案。