gpt4 book ai didi

regex - 为什么在 Visual Studio 中具有正向回溯的正则表达式会导致每隔一个匹配项被替换?

转载 作者:行者123 更新时间:2023-12-04 21:14:01 25 4
gpt4 key购买 nike

鉴于以下正则表达式包含正向后视(从我实际尝试使用的简化):

(?<=\s|\n)(".*?")

以及以下替换表达式:
_T($1)

Visual Studio 2013 会找到每个匹配的字符串,但在替换时,将替换与后续匹配对应的字符串,因此将每隔一个字符串替换一次。

此外, Replace All不起作用并说它找不到任何匹配的文本(即使 Find All 会找到相关的字符串)。

这是 Visual Studio 中的错误还是我做错了什么?

演示:

enter image description here

最佳答案

TLDR; 使用 VS Regexe 的 Visual Studio (VS) 搜索/替换必须与 Visual Studio 操作一起使用,并且由于所有移动部件,看似有效的正则表达式将不起作用。

说明因为在 Visual Studio 中,实际上有很多东西都与这种后视模式相悖​​。他们每个人都在单独工作以实现您所看到的;但它们是个人行为,而不是一个思想失败的阴谋。让我通过 1/2/3 列出它们:

#1 :在正则表达式模式中使用任何类型的后视/前瞻时,必须注意它不会捕获 它在回顾中指定了什么。捕获发生在它之后的内容上。因此,您的“查找下一个”项目不会捕获其后面的空格或换行符。 (这是您想要的,这是合乎逻辑的)但请参阅下文中未捕获之前的空间和突出显示每组的方式以及这如何干扰整个过程。

Individual matches using the lookbehind

独立工作,这就是预期的,作为搜索/突出显示 ,但随后#2 开始发挥作用。

#2 :Visual Studio 编辑器不是真正的正则表达式替换操作。因为它在做两个步骤操作进行替换;这些步骤不像代码正则表达式替换那样集成。让它沉入其中。

第一步是查找,第二步是替换。全部替换是从当前位置到文件末尾的多个两步(查找/替换)操作。

在这个单一的替换跳过问题上,在第一次按下时,因为 Replace Next必须先找到下一个项目,它不会替换它;按设计它只是将突出显示移动到下一个“XXXXXX”字符串。

(按 2) 用户认为 Studio 将替换突出显示的内容,但在这种情况下不会发生,因为匹配模式指出 当前比赛位置必须有 \s|\n在其中;诅咒,后视!

因为它没有 \s|\n当前选择中的lookbehind 必须移动当前突出显示之后的下一个位置的文本点,如果找到则替换那里。

enter image description here

需要明确的是,因为替换操作是基于引用而不是 \s|\n ( 按照模式 的指示),它必须将当前指针移动到下一个 \s|\n它找到它并替换文本。注意蓝色的两次点击碰巧执行

#3 : 有趣的是,如果不做匹配替换,$1 ,但只是一些文字,替换所有作品,uggg令人困惑。

enter image description here

因为替换匹配 $1在任何单独的搜索/替换步骤中都不可行,替换所有操作随后会锁定。

摘要

您想要做的是合乎逻辑的,但是因为正则表达式替换为后视是与编辑器指针和两步查找/替换正则表达式操作的抖动,单个场景的结合导致整个操作失败。

必须设计一个 视觉工作室正则表达式模式与上面指出的#1/#2/#3 编辑器特性一起使用。 请记住,VS 正则表达式不是真正的 .NET 正则表达式解析器……只是一次关闭。

这是一个错误吗?也许。但恕我直言,修复将需要对搜索/替换功能进行整体重新设计,使其比现在以纯文本搜索为中心(使用正则表达式模式)更加以正则表达式为中心。

关于regex - 为什么在 Visual Studio 中具有正向回溯的正则表达式会导致每隔一个匹配项被替换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28726322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com