我需要在字符串中用字符(比如说)P替换字符(比如说)x,但前提是它包含在带引号的子字符串中.一个例子使它更清楚:
axbx'cxdxe'fxgh'ixj'k -> axbx'cPdPe'fxgh'iPj'k
为简单起见,我们假设引号总是成对出现.
显而易见的方法是一次只处理一个字符串(简单的状态机方法);
但是,我想知道是否可以使用正则表达式一次完成所有处理.
我的目标语言是C#,但我想我的问题与任何具有内置或支持正则表达式的语言有关.
我将Greg Hewgill的python代码转换为C#并且它有效!
[Test] public void ReplaceTextInQuotes() { Assert.AreEqual("axbx'cPdPe'fxgh'iPj'k", Regex.Replace("axbx'cxdxe'fxgh'ixj'k", @"x(?=[^']*'([^']|'[^']*')*$)", "P")); }
那个测试过去了.
我能用Python做到这一点:
>>> import re >>> re.sub(r"x(?=[^']*'([^']|'[^']*')*$)", "P", "axbx'cxdxe'fxgh'ixj'k") "axbx'cPdPe'fxgh'iPj'k"
这样做是使用非捕获匹配(?= ...)来检查字符x是否在带引号的字符串中.它会查找下一个引号之前的一些非引号字符,然后查找单个字符或引用字符组的序列,直到字符串结尾.
这取决于您的假设,即报价始终是平衡的.这也不是很有效.