Jam*_*son 5 regex replace visual-studio
给定以下正则表达式正则表达式(从我实际上想使用的正则表达式简化):
(?<=\s|\n)(".*?")
Run Code Online (Sandbox Code Playgroud)
和以下替换表达式:
_T($1)
Run Code Online (Sandbox Code Playgroud)
Visual Studio 2013将找到每个匹配的字符串,但是在替换时,将替换与后续匹配相对应的字符串,因此将替换第二个字符串。
此外,Replace All
它不起作用,并说它找不到任何匹配的文本(即使a Find All
会找到相关的字符串)。
这是Visual Studio中的错误,还是我做错了什么?
演示:
太长了;使用 VS Regexe 的 Visual Studio (VS) 搜索/替换必须与 Visual Studio 操作一起使用,并且由于所有移动部件,看似有效的正则表达式将不起作用。
解释因为在 Visual Studio 中实际上有多种因素与这种后向模式发生冲突。他们每个人都在单独工作以实现您所看到的目标;但它们是个人的行动,而不是一个思想失败的阴谋集团。让我通过 1/2/3 列出它们:
#1:在正则表达式模式中使用任何类型的lookbehind/ahead 时,必须注意它不会捕获它在lookbehind 中指定的内容。捕获发生在其之后发生的事情上。因此,您的“查找下一个”项目不会捕获其后面的空格或换行符。(这就是您想要的,这是合乎逻辑的)但是请参阅下面如何未捕获它之前的空间以及如何突出显示每个集合以及这如何干扰整个过程。
单独来看,它是有效的,并且是预期的,作为搜索/突出显示,但随后 #2 开始发挥作用。
#2:Visual Studio 编辑器不是真正的正则表达式替换操作。因为它正在执行两步操作来进行替换;这些步骤不像代码正则表达式替换那样集成。让它沉入其中。
第一步是查找,第二步是替换。全部替换是多个两步(查找/替换)操作,直到从当前位置到文件末尾。
在这个单一替换跳过问题上,在第一次按下时,因为Replace Next
必须首先找到下一个项目,所以它不会替换它;根据设计, 它只是将突出显示移动到下一个“XXXXXX”字符串。
(按 2)用户认为 Studio 将替换突出显示的内容,但在这种情况下不会发生这种情况,因为匹配模式规定当前匹配位置必须在\s|\n
其中;诅咒,回头看!
因为它在当前选择中没有\s|\n
向后查找,所以它必须移动当前突出显示后的下一个位置的文本点,如果找到,则在那里进行替换。
需要明确的是,因为替换操作位于引号而不是 a \s|\n
(按照模式的指示),所以它必须将当前指针移动到\s|\n
它找到的下一个指针并替换文本。请注意,两次单击蓝色的按钮恰好执行了以下操作
#3:有趣的是,如果不进行匹配替换,$1
而只是一些文本,则替换所有作品,令人困惑。
由于替换匹配$1
在任何单个搜索/替换步骤中都不可行,因此替换所有操作随后会锁定。
概括
您想要做的事情是合乎逻辑的,但是由于正则表达式替换与后向查找会随着编辑器指针和两步查找/替换正则表达式操作而抖动,因此各个场景的结合会导致整个操作失败。
必须设计一种Visual Studio正则表达式模式才能与上面指出的 #1/#2/#3 编辑器特性一起使用。请记住,VS 正则表达式不是真正的 .NET 正则表达式解析器...只是一个接近的一次性。
这是一个错误吗?或许。但恕我直言,修复需要对搜索/替换功能进行整体重新设计,使其比现在以纯文本搜索为中心(使用正则表达式模式)更加以正则表达式为中心。
归档时间: |
|
查看次数: |
424 次 |
最近记录: |