正则问题:替换不被括号包围的特定字符

Toonyxm 2012-03-19 10:31:15
想把不被括号圈住的-替换成\, 求教这个正则应该怎么写...

比如..
原文为...
(ASD-DFG-GHI-IGK)ASD-DEF-IGK-

替换后变成...
(ASD-DFG-GHI-IGK)ASD\DEF\IGK\

之前尝试过这样写..
[^(].*-.*[^)] 但是匹配不到... 很尴尬...
...全文
147 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
-过客- 2012-03-19
  • 打赏
  • 举报
回复
一个正则搞定倒也简单

Regex reg = new Regex(@"(?n)(?<=(^|\))[^()]*)-");
string result = reg.Replace(yourStr, "\\");
richTextBox2.Text = result;
EnForGrass 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 return_false 的回复:]

C# code
string tempStr = "(ASD-DFG-GHI-IGK)ASD-DEF-IGK-";
string pattern = @"(?<=\([^)]+\)[\s\S]*?)-";
tempStr = Regex.Replace(tempStr, pattern, @"\");//(ASD-DFG-GHI-……
[/Quote]
正解
-过客- 2012-03-19
  • 打赏
  • 举报
回复
不涉及嵌套的情况下,用委托更容易理解

Regex reg = new Regex(@"(?n)(^|\))[^()]+(\(|$)");
string result = reg.Replace(yourStr, delegate(Match m) { return m.Value.Replace("-", "\\"); });
richTextBox2.Text = result;
  • 打赏
  • 举报
回复
string tempStr = "(ASD-DFG-GHI-IGK)ASD-DEF-IGK-";
string pattern = @"(?<=\([^)]+\)[\s\S]*?)-";
tempStr = Regex.Replace(tempStr, pattern, @"\");//(ASD-DFG-GHI-IGK)ASD\\DEF\\IGK\\
HimeTale 2012-03-19
  • 打赏
  • 举报
回复
如果括号不会嵌套的话,可以用

(^|\))[^\(]+($|\()
  • 打赏
  • 举报
回复
只是因为你在封闭括号后边不是紧跟着-,不是有字母就是有空格,试问怎么能够匹配成功呢?
xiaoyu821120 2012-03-19
  • 打赏
  • 举报
回复
试试看这个(?<!\([^-]*)-(?![^(]*\))
Toonyxm 2012-03-19
  • 打赏
  • 举报
回复
上面的回复输入有误...

原文...
但是还有一个问题, 在使用(?<=\([^)]+\))时可以匹配出一个封闭的括号...
那么按理来说使用(?<=\([^)]+\))-就是匹配那个封闭括号后面的-... 但是结果跟我想的不一样

实为...
但是还有一个问题, 在使用\([^)]+\)时可以匹配出一个封闭的括号...
那么按理来说使用(?<=\([^)]+\))-就是匹配那个封闭括号后面的-... 但是结果跟我想的不一样
Toonyxm 2012-03-19
  • 打赏
  • 举报
回复
非常抱歉... 因为我的失误举了一个特例...
应该是适用于这样的情况...

原文...
AAA-SD-AASAFA (ASD-DFG-GHI-IGK)ASD-DEF-IGK-
asfsff- fsdfa- (asdf -safsdf- sd-af) - - -

结果为...
AAA\SD\AASAFA (ASD-DFG-GHI-IGK)ASD\DEF\IGK\
asfsff\ fsdfa\ (asdf -safsdf- sd-af) \ \ \

也就是说在全文中把不在括号中的-替换成\ ()...

[Quote=引用 2 楼 return_false 的回复:]

C# code
string tempStr = "(ASD-DFG-GHI-IGK)ASD-DEF-IGK-";
string pattern = @"(?<=\([^)]+\)[\s\S]*?)-";
tempStr = Regex.Replace(tempStr, pattern, @"\");//(ASD-DFG-GHI-……
[/Quote]

Return_false,非常感谢您的回答,看了您的回答我才想起还有断言的存在... 罪过... 罪过...
在您的答案的基础上我做了些修改...
"(?=[\s\S].*?\([^)]+\))-|(?<=\([^)]+\)[\s\S]*?)-"
使用这条正则发下上文所示的原文中第二行的括号内的-被误匹配了...
于是再次修改"(?=.*?\([^)]+\))-|(?<=\([^)]+\).*?)-"
使用这条正则匹配正常...
再次感谢您的回答...

但是还有一个问题, 在使用(?<=\([^)]+\))时可以匹配出一个封闭的括号...
那么按理来说使用(?<=\([^)]+\))-就是匹配那个封闭括号后面的-... 但是结果跟我想的不一样...
对于上文这条正则没有任何结果....
但对于(ASD-DFG-GHI-IGK)-ASD-DEF-IGK-这段文字仅能匹配括号外的第一个-

必须加入.*?变成(?<=\([^)]+\).*?)-才能匹配所有的- (经测试不使用懒惰模式也能正常匹配..)
关于这点有点想不明白... 麻烦再帮忙解答一下...
非常感谢...

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧