替换为在Visual Studio中使用正则表达式:意外结果

时间:2011-06-15 22:10:31

标签: regex visual-studio-2010

我必须将一些硬编码的字符串移动到外部资源文件,我正在尝试使用正则表达式自动执行一些过程。

但是我在使用它时遇到了一些困难。

示例代码摘录:

    public List<string> GetAllProductIDs()
    {
        var doc = XElement.Load(Path + @"\light.xml");
        var elements = doc.Element("products").Elements("product");
        // (...)

我使用的正则表达式:

  • find what =“{([^”\ r] *)}“

(找到一个以双撇号开头和结尾的字符串,中间不包含另一个双撇号,也不包含换行符;并且在没有第一个和最后一个双撇号的情况下捕获它)

  • 替换为= Resources。\ 1

我的目的是

  • 元素( “产品”)

会变成

  • 元素(Resources.products)

会发生什么

预期结果:正则表达式匹配var doc = XElement.Load(Path + @ “\ light.xml”);

意外结果:正则表达式匹配* var elements = doc.Element(“products ”)。元素(“ product”); (这是我可以应付的,我只是手动跳过它)

但它不符合 “产品” ,也不符合 “产品”

为什么?

2 个答案:

答案 0 :(得分:1)

内置的Visual Studio正则表达式与更常见的正则表达式不同。

问题是\r按字面解释而不是作为返回控制字符。 appear to be supported by the Visual Studio regex flavor\r不是其中之一,只有少数控制字符。因此,引擎正在使用它。

要验证这一点,请将\r更改为\a,您会发现它与“产品”和“产品”匹配就好了。原因是这些单词中不存在文字字符“a”,因此匹配成功,而\r使匹配失败,因为字母“r”确实存在于这些单词中。

要解决此问题,您可以通过其Unicode十六进制值(000D)来引用返回控制字符。将\r更改为\u000D\x0D

"{([^"\u000D]*)}"

"{([^"\x0D]*)}"

您可能有兴趣查看Visual Studio Productivity Power Tools,它支持大多数人习惯的.NET Regex风格。使用该工具,您将使用:

  • 模式:"([^"\r]*)"请注意\r在这种情况下按预期工作。
  • 替换:Resources.$1

答案 1 :(得分:0)

我正在尝试替换xml:

替换:

<metaKeyword2>Avaeon.Topoix.Gravity.Add</metaKeyword2>

用这个

<metaKeywords>
      <metaKeyword>
        <keyword>Avaeon.Topoix.Gravity.Add</keyword>
      </metaKeyword>
    </metaKeywords>

属性中的值是可变的,我似乎无法得到它,我怀疑XML的&lt; &GT;打破它,这是我尝试过的

<metaKeyword2>:w</metaKeyword2>

<metaKeywords>
      <metaKeyword>
        <keyword>\1</keyword>
      </metaKeyword>
    </metaKeywords>

但它一无所获。