【问题标题】:regex for unselecting inside selection用于取消选择内部选择的正则表达式
【发布时间】:2011-04-04 22:39:52
【问题描述】:

一个例子,

我有一个字符串,其中包含:

主函数{

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

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

}

我怎样才能只选择在 '''s 中和不在 {}'s 中的单词。此示例将返回输出:

匹配 1:

'你好{

} 世界{

}!'

第 2 场比赛:

我{

}我'

第 3 场比赛:

'asd'

非常感谢!

【问题讨论】:

  • 我需要正则表达式中的所有工作
  • 你能确定 's 和 {}s 匹配吗?
  • 是的,需要包含它们
  • 抱歉,我想我误解了这个问题,我不确定你的组应该是什么。
  • 比赛,比赛 1,比赛 2,比赛 3...抱歉造成混乱

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


【解决方案1】:

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

【讨论】:

  • 你是什么意思,你能在一个正则表达式中写第二个选项吗?
  • 第二个选项我的意思是它提供3个字符串的那个
  • 不,我不能只用一个正则表达式,抱歉。
【解决方案2】:
MatchCollection matches = Regex.Matches(myInput, "'[^']+'", RegexOptions.SingleLine | RegexOptions.MultiLine);

现在的诀窍是只选择找到的匹配项的 even 索引。

【讨论】:

  • 我不确定这有什么帮助 - 它与 {curly} 块无关,并且 OP 需要所有 'single quoted' 块。此外,SingleLine 使. 匹配新行。 MultiLine 使 ^/$ 匹配新行。这些都不存在于您的模式中...
【解决方案3】:

这应该让你得到你所追求的,分两步:

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,但当有更简单的替代方案时,我认为这不是问题的正确答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2012-06-23
    • 1970-01-01
    • 2018-11-29
    • 2015-01-11
    • 2016-01-11
    • 1970-01-01
    相关资源
    最近更新 更多