C# 编写替换正则表达式

C# 编写替换正则表达式,c#,regex,C#,Regex,我需要一些写正则表达式的帮助。我有以下字符串 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将是\u

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

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
将是
\u 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]+)"
但这只取“标记中
”前面的最后一个字母,而不取最后一个子字符串的第一个字母


提前感谢

这就成功了,非贪婪部分使它无法捕获太多

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

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

Regex r = new Regex("([a-z]{3})[a-z]*_IN_(\d+)");
您可能需要一个RegexOptions.IgnoreCase,以防出现大写字母。 如果正则表达式被定义为静态成员,则可以考虑使用ReXExtOptudio。 上述正则表达式将匹配字符串aaa_uBBBBBB_中的bbb(123)。
L.B.给出的答案与aaa相符。
Frederik C给出的答案不匹配,因为没有“.”(如您的第三个示例)

这必须是正则表达式吗?看起来像是可以用
string.Split
string.Format
来完成的。是的,正则表达式的使用是一个限制:(什么是
*([^\]{3})[^\.]
应该是什么意思?不,是自定义框架限制。这是针对可以接受正则表达式的查询解析器。(^\\)(.{3})[^\]*\+-$2($3)关于LB的正则表达式,你是对的。另一方面,你的正则表达式没有考虑点。我更新了示例,始终显示至少两个点,因此Fredrik的一个是正确的。抱歉误解。我不明白为什么点很重要,我的正则表达式使用或不使用点都可以使它更准确、灵活、更快d更容易阅读-这是你的选择。