【问题标题】:Visual Studio 2015 Regex Replace Not Working (Regex Match Working)Visual Studio 2015 正则表达式替换不起作用(正则表达式匹配工作)
【发布时间】:2017-06-01 11:49:46
【问题描述】:

我正在尝试替换大型项目中的 XML 文档 cmets,该项目错误地使用 <item></item> 而不是 <item><description></description></item>。我认为使用 Visual Studio 的查找和替换功能可能是最快的方法。所以,我想出了以下正则表达式:

(?ixs)(?<=///.*<item\b[^>]*>)(?<description>[^\<]*?)(?=</\s*?item>)

在 Visual Studio 2015 的查找和替换功能的“在文件中查找”模式下,正则表达式匹配项目中的 249 行。

但是,如果我尝试使用“查找和替换”,并在“替换为”文本框中使用 &lt;description&gt;${description}&lt;/description&gt;,则会得到零匹配项。

我尝试使用$1$2$+ 而不是${description},但在每种情况下我都得到零匹配。

我还在“替换为”文本框中使用了文字值 REPLACEMENT,它将所有 249 行替换为单词 REPLACEMENT

我在 Visual Studio 2015 和 2017 中都试过了,结果相同。

根据MSDN,这应该是替换文本的语法。那么为什么它在 Visual Studio 中不起作用?

注意:我正在尝试的项目是 https://github.com/apache/lucenenet,以防有人想在与我相同的条件下进行测试。

环境:

  • Windows 10 x64
  • Visual Studio 2015 社区版(更新 3)

示例输入

/// For more examples, see the <see cref="Lucene.Net.Analysis"/> namespace documentation.
/// <para/>
/// For some concrete implementations bundled with Lucene, look in the analysis modules:
/// <list type="bullet">
///   <item>Common:
///       Analyzers for indexing content in different languages and domains.</item>
///   <item>ICU:
///       Exposes functionality from ICU to Apache Lucene.</item>
///   <item>Kuromoji:
///       Morphological analyzer for Japanese text.</item>
///   <item>Morfologik:
///       Dictionary-driven lemmatization for the Polish language.</item>
///   <item>Phonetic:
///       Analysis for indexing phonetic signatures (for sounds-alike search).</item>
///   <item>Smart Chinese:
///       Analyzer for Simplified Chinese, which indexes words.</item>
///   <item>Stempel:
///       Algorithmic Stemmer for the Polish Language.</item>
///   <item>UIMA:
///       Analysis integration with Apache UIMA.</item>

【问题讨论】:

  • 在将(?&lt;description&gt;[^\&lt;]*?) 更改为([^\&lt;]*?) 时,您是否尝试使用$1 反向引用?
  • @revo - 是的,我也试过了。我还使用自制的正则表达式测试实用程序测试了正则表达式,该实用程序正确地将文本提取到默认和第一个捕获组中。
  • 您确认正则表达式匹配字符而不是位置?
  • 是的,它从组中提取文本并且绝对正确地匹配它。或者,你的意思是别的吗?
  • 好的。另请添加示例输入。

标签: c# regex visual-studio visual-studio-2015


【解决方案1】:

我可以在 VS2012 中确认问题。必须更改正则表达式以考虑换行符(([^\&lt;]|\r\n)*? 而不仅仅是[^\&lt;]*?)。它在逐个替换项目时起作用,但当您想要全部替换时则不起作用。可能是一个错误。

这可行(不使用前瞻和后瞻):

查找:&lt;item&gt;(([^\&lt;]|\r\n)*)
替换为:&lt;item&gt;&lt;description&gt;$1&lt;/description&gt;

【讨论】:

  • 我也注意到了这一点。它仍然存在于 VS 2017 的最新更新中。在“查找内容”文本中使用前瞻或后视结构时,“全部替换”什么也不做。相反,我必须为每个实例单击“替换” - 更糟糕的是,它经常跳过替换实例的替换,需要对每个文件进行多次遍历,直到只剩下一个实例 - 这通常无法替换。
【解决方案2】:

我在 Visual Studio 2015 中使用常规查找和替换时也遇到了这个问题(查找全部和替换全部不起作用,但替换在给定文件中工作)。我在“选择”中执行查找:我选择了文本我想运行 REGEX 替换,按 Ctrl + H 查找和替换工具并开始输入 REGEX(此时 Visual Studio 开始突出显示所选内容中的文本)。当我然后单击“全部替换”或“查找全部”时,没有找到任何结果,但我发现如果我再次选择文本并且查找和替换工具仍然打开,那么查找全部和全部替换又开始工作了!

这似乎是一个错误,因为在我编写 REGEX 时文本已经被选中并被取消选中(即使它不再具有通常的选择背景颜色,与文件的其余部分表明它仍然被选中,即使 Find & Replace 的行为就像它没有被选中一样!)。

我不知道这是否直接回答了您的问题,因为我不确定您在“查找”中使用的是什么模式,但如果是“选择”,那么这可能是问题所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2015-11-30
    • 2014-09-03
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多