为什么在 Visual Studio 中具有正向回顾的正则表达式会导致每隔一个匹配项被替换一次?
Why does a regular expression with a positive lookbehind in Visual Studio cause every second match to be substituted?
鉴于以下正则表达式包含正后视(从我实际尝试使用的那个简化而来):
(?<=\s|\n)(".*?")
和以下替换表达式:
_T()
Visual Studio 2013 将查找每个匹配的字符串,但在替换时,将替换对应于 后续 匹配的字符串,因此将替换每个第二个字符串。
此外,Replace All
不起作用并表示找不到任何匹配的文本(即使 Find All
会找到相关的字符串)。
这是 Visual Studio 中的错误还是我做错了什么?
演示:
TLDR; Visual Studio (VS) search/replace 使用 VS 正则表达式必须与 Visual Studio 操作一起使用并且看起来是有效的由于所有移动部件,正则表达式将无法工作。
解释 因为在 visual studio 中实际上有很多事情与后视模式 相悖。他们每个人都在单独工作以实现您所看到的;但它们是个人行为,而不是一个思想失败的阴谋集团。让我通过 1/2/3 列出它们:
#1:在正则表达式模式中使用任何类型的 lookbehind/ahead 时,必须注意它 不捕获 它在回顾中指定的内容。捕获发生在它之后发生的事情上。因此,您的“查找下一个”项目不会捕获其后的 space 或换行符。 (这是你想要的,这是合乎逻辑的)但是请看下面的 space 在它没有被捕获之前是如何突出显示的,以及它是如何干扰整个过程的。
独立工作,这就是预期的效果,作为 search/highlight,但随后 #2 开始发挥作用。
#2: Visual Studio 编辑器不是真正的正则表达式替换操作。因为它是做一个two步操作来做一个replace;这些步骤不像代码正则表达式替换那样集成。 让它沉入其中。
第一步是查找,第二步是替换。全部替换为多个两步 (Find/Replace) 操作,直到文件末尾从当前位置开始。
关于这个单个替换跳过的问题,在第一次按下时,因为Replace Next
必须先找到下一个项目,所以它不会替换它; 设计 它只是 将突出显示移动到下一个“XXXXXX”字符串。
(按 2)用户认为 Studio 将替换突出显示的内容,但在这种情况下并没有发生,因为匹配模式说明 当前匹配位置必须有\s|\n
在其中;诅咒,回头看!
因为它没有 \s|\n
的后视 在当前选择中 它必须移动文本点,它是当前突出显示之后的下一个位置,并且如果找到,则在那里进行替换。
需要明确的是,因为替换操作是基于引号而不是 \s|\n
( 按照模式 的指示),它 必须 将当前指针移动到它找到的下一个 \s|\n
并替换文本。请注意蓝色的两次点击恰好执行
#3:有趣的是,如果不做匹配替换,</code>,只是一些文字,替换所有作品,uggg混淆.</p>
<p><a href="https://i.stack.imgur.com/zXDuk.gif" rel="nofollow noreferrer"><WBIMG:11532476-3.gif></a></p>
<p>因为替换匹配 <code>
在任何单独的 search/replace 步骤中都不可行,替换所有操作随后被锁定。
总结
你想做的是合乎逻辑的,但因为正则表达式替换为后视正在与编辑器指针一起跳动,并且 find/replace 与正则表达式操作的两步,个别场景的结合导致整个操作失败。
必须设计一个 visual studio 正则表达式模式才能与上面指出的 #1/#2/#3 编辑器特性一起工作。 请记住,VS 正则表达式不是真正的 .NET 正则表达式解析器...只是一个关闭 one-off.
这是一个错误吗?可能是。但恕我直言,修复需要对 search/replace 功能进行整体重新设计,使其更 以正则表达式为中心 而不是 以纯文本搜索为中心 (使用正则表达式模式) 就像现在一样。
鉴于以下正则表达式包含正后视(从我实际尝试使用的那个简化而来):
(?<=\s|\n)(".*?")
和以下替换表达式:
_T()
Visual Studio 2013 将查找每个匹配的字符串,但在替换时,将替换对应于 后续 匹配的字符串,因此将替换每个第二个字符串。
此外,Replace All
不起作用并表示找不到任何匹配的文本(即使 Find All
会找到相关的字符串)。
这是 Visual Studio 中的错误还是我做错了什么?
演示:
TLDR; Visual Studio (VS) search/replace 使用 VS 正则表达式必须与 Visual Studio 操作一起使用并且看起来是有效的由于所有移动部件,正则表达式将无法工作。
解释 因为在 visual studio 中实际上有很多事情与后视模式 相悖。他们每个人都在单独工作以实现您所看到的;但它们是个人行为,而不是一个思想失败的阴谋集团。让我通过 1/2/3 列出它们:
#1:在正则表达式模式中使用任何类型的 lookbehind/ahead 时,必须注意它 不捕获 它在回顾中指定的内容。捕获发生在它之后发生的事情上。因此,您的“查找下一个”项目不会捕获其后的 space 或换行符。 (这是你想要的,这是合乎逻辑的)但是请看下面的 space 在它没有被捕获之前是如何突出显示的,以及它是如何干扰整个过程的。
独立工作,这就是预期的效果,作为 search/highlight,但随后 #2 开始发挥作用。
#2: Visual Studio 编辑器不是真正的正则表达式替换操作。因为它是做一个two步操作来做一个replace;这些步骤不像代码正则表达式替换那样集成。 让它沉入其中。
第一步是查找,第二步是替换。全部替换为多个两步 (Find/Replace) 操作,直到文件末尾从当前位置开始。
关于这个单个替换跳过的问题,在第一次按下时,因为Replace Next
必须先找到下一个项目,所以它不会替换它; 设计 它只是 将突出显示移动到下一个“XXXXXX”字符串。
(按 2)用户认为 Studio 将替换突出显示的内容,但在这种情况下并没有发生,因为匹配模式说明 当前匹配位置必须有\s|\n
在其中;诅咒,回头看!
因为它没有 \s|\n
的后视 在当前选择中 它必须移动文本点,它是当前突出显示之后的下一个位置,并且如果找到,则在那里进行替换。
需要明确的是,因为替换操作是基于引号而不是 \s|\n
( 按照模式 的指示),它 必须 将当前指针移动到它找到的下一个 \s|\n
并替换文本。请注意蓝色的两次点击恰好执行
#3:有趣的是,如果不做匹配替换,</code>,只是一些文字,替换所有作品,uggg混淆.</p>
<p><a href="https://i.stack.imgur.com/zXDuk.gif" rel="nofollow noreferrer"><WBIMG:11532476-3.gif></a></p>
<p>因为替换匹配 <code>
在任何单独的 search/replace 步骤中都不可行,替换所有操作随后被锁定。
总结
你想做的是合乎逻辑的,但因为正则表达式替换为后视正在与编辑器指针一起跳动,并且 find/replace 与正则表达式操作的两步,个别场景的结合导致整个操作失败。
必须设计一个 visual studio 正则表达式模式才能与上面指出的 #1/#2/#3 编辑器特性一起工作。 请记住,VS 正则表达式不是真正的 .NET 正则表达式解析器...只是一个关闭 one-off.
这是一个错误吗?可能是。但恕我直言,修复需要对 search/replace 功能进行整体重新设计,使其更 以正则表达式为中心 而不是 以纯文本搜索为中心 (使用正则表达式模式) 就像现在一样。