可以使用Regex进行这种特殊的字符串操作吗?

Cri*_*scu 7 c# python regex language-agnostic

我需要在字符串中用字符(比如说)P替换字符(比如说)x,但前提是它包含在带引号的子字符串中.一个例子使它更清楚:

axbx'cxdxe'fxgh'ixj'k  -> axbx'cPdPe'fxgh'iPj'k
Run Code Online (Sandbox Code Playgroud)

为简单起见,我们假设引号总是成对出现.

显而易见的方法是一次只处理一个字符串(简单的状态机方法);
但是,我想知道是否可以使用正则表达式一次完成所有处理.

我的目标语言是C#,但我想我的问题与任何具有内置或支持正则表达式的语言有关.

jop*_*jop 9

我将Greg Hewgill的python代码转换为C#并且它有效!

[Test]
public void ReplaceTextInQuotes()
{
  Assert.AreEqual("axbx'cPdPe'fxgh'iPj'k", 
    Regex.Replace("axbx'cxdxe'fxgh'ixj'k",
      @"x(?=[^']*'([^']|'[^']*')*$)", "P"));
}
Run Code Online (Sandbox Code Playgroud)

那个测试过去了.


Gre*_*ill 8

我能用Python做到这一点:

>>> import re
>>> re.sub(r"x(?=[^']*'([^']|'[^']*')*$)", "P", "axbx'cxdxe'fxgh'ixj'k")
"axbx'cPdPe'fxgh'iPj'k"
Run Code Online (Sandbox Code Playgroud)

这样做是使用非捕获匹配(?= ...)来检查字符x是否在带引号的字符串中.它会查找下一个引号之前的一些非引号字符,然后查找单个字符或引用字符组的序列,直到字符串结尾.

这取决于您的假设,即报价始终是平衡的.这也不是很有效.