Регулярная разница между vscode и visual studio - PullRequest
2 голосов
/ 08 февраля 2020

разница регулярных выражений между vscode и visual studio

начиная с

line1
line2

find: ^ (. +) $ Replace: "$ 1",

В vscode это работает как ожидалось, в результате

"line1",
"line2",

В студии, кажется, не работает, в результате

"line1
",
"line2
",

Какой из них правильный? Я предполагаю vscode.

Ответы [ 2 ]

4 голосов
/ 08 февраля 2020

TL; DR: Используйте ^(.*[^\r\n]) для сопоставления всей строки без символов EOL.

В соответствии с Документами :

| Purpose                                          | Expression | Example                                                                       |
|--------------------------------------------------|------------|-------------------------------------------------------------------------------|
| Match any single character (except a line break) | .          | a.o matches "aro" in "around" and "abo" in "about" but not "acro" in "across" |
| Anchor the match string to the end of a line     | \r?$       | car\r?$ matches "car" only when it appears at the end of a line               |
| Anchor the match string to the end of the file   | $          | car$ matches "car" only when it appears at the end of the file                |

Тем не менее, по некоторым причинам это не так (например, . соответствует разрыву строки, а .$ соответствует концу любой строки ). Все следующие шаблоны будут совпадать от начала до конца строки , включая символы EOL : ^.+, ^.+$, ^.+\r?$.

Я заметил такое поведение в VS2017 раньше, и я не уверен, почему это происходит, но я смог обойти это, используя что-то вроде следующего:

^(.*[^\r\n])

Примечание: Вы также можете избавиться от группы захвата и заменить на "$0",.

1 голос
/ 08 февраля 2020

В шаблонах регулярных выражений VSCode точка . соответствует любому символу, но любые символы разрыва строки.

In. NET Регулярное выражение, используемое в Visual Studio, точка соответствует любому символу, кроме новой строки, LF, char.

Эта разница объясняет результаты, которые вы получаете, и вы не можете назвать их правильными или неправильными, это всего лишь различия в regex engine.

Обратите внимание, что вы не заметили бы никакой разницы между этими двумя механизмы, если вы использовали окончания строк только для LF, но Visual Studio в Windows по умолчанию использует окончания CRLF.

Чтобы обернуть всю строку двойными кавычками, используя. NET regex, просто исключите оба Символы LF и CR (возврат каретки) из сопоставления путем замены точки на класс символов с отрицанием [^\r\n]:

^[^\r\n]+

И замены на шаблон "$&",, где $& относится ко всему совпадению.

Вы можете избавиться от группы захвата в регулярном выражении VSCode и использовать тот же шаблон замены, что и в. NET тоже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...