【问题标题】:Writing a Replace Regex编写替换正则表达式
【发布时间】:2012-03-27 20:42:40
【问题描述】:

我需要一些帮助来编写正则表达式。我有以下字符串,

xxx.yyy.wwwwwaaa_IN_123                
xxx.rrrttttt_IN_12355                  
zz.iiiiolll_IN_12                         
xxx.zzzz.rrrr.yyy.wwwwwwww_IN_1232 

使用 Regex.Replace,我想将字符串从上述格式更改为类似

"$1($2)" 其中$2 是字符串末尾的数字,$1_IN_ 标记之前最后一个子字符串的前三个字母。

换句话说,

xxx.yyy.wwwwwaaa_IN_123                www(123)
xxx.rrrttttt_IN_12355                  rrr(12355)
iiiiolll_IN_12                         iii(12)
xxx.zzzz.rrrr.yyy.wwwwwwww_IN_1232     www(1232)

这就是我所拥有的,

".*.([^\.]{3})[^\.]_IN_+([0-9]+)"

但这只接受_IN_ 标记之前的最后一个字母,而不是最后一个子字符串的第一个字母。

提前致谢

【问题讨论】:

  • 这个是一个正则表达式吗?看起来可以用string.Splitstring.Format 完成。
  • 是的,正则表达式的使用是一个限制:(
  • .*.([^\.]{3})[^\.] 应该是什么意思?
  • 不,自定义框架限制。这是一个可以接受正则表达式的查询解析器。
  • (^|\.)(.{3})[^_]*_IN_([0-9]+) -- $2($3)

标签: c# regex


【解决方案1】:

这可以解决问题,非贪婪部分使其无法捕获太多...

Regex.Match(input, @"(?:.*?\.)?(.{3})[^.]*?_IN_(\d+)");

【讨论】:

    【解决方案2】:

    好吧,正确的正则表达式是:

    Regex r = new Regex("([a-z]{3})[a-z]*_IN_(\d+)");
    

    您可能需要 RegexOptions.IgnoreCase 以防可能存在大写字母。 如果您将正则表达式定义为静态成员,您可以考虑使用 RegexOptions.Compiled。

    上述正则表达式将匹配字符串 aaa_bbbbbb_IN_123 中的 bbb(123)。
    L.B 给出的答案将匹配 aaa。 Frederik C 的答案将不匹配,因为没有“。” (就像你的第三个例子)

    【讨论】:

    • 你对 LB 的正则表达式是正确的。另一方面,你的没有考虑到这些点。我已将示例更新为始终显示至少两个点,因此 Fredrik 的那个是正确的。很抱歉造成误解。
    • 我不明白为什么这些点很重要,我的正则表达式可以使用或不使用点,使其更准确、更灵活、更快、更容易阅读 - 这是你的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2015-01-24
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多