Как сохранить возвратную колесницу с регулярным выражением в расширении vscode? - PullRequest
1 голос
/ 29 марта 2019

Я пишу расширение стиля кода OCaml в VSCode.Я бы правильно отформатировал разделитель :.

Мой код отлично работает для моего теста, за исключением новой строки

let editor = vscode.window.activeTextEditor;)

// text1 for test azae:aaz azea: zae azeaz :zae eaz:  zeazea azeaz  :zae
// text2 for test azae:aaz azea:    zae azeaz   :zae eaz:       zeazea azeaz        :zae
// text3 for test azae:
// aze

let selection = editor.selection
let text = editor.document.getText(selection)
textreg = text.replace(new RegExp(/(\s|\t)*[\:](\s|\t)*/g,'gi'),": ")
editor.edit(builder => builder.replace(selection, textreg));

Я получаю:

text3 for test azae:    // aze

и янадеюсь получить:

text3 for test azae:
// aze

Как я могу это сделать?

Редактировать: Спасибо за комментарий, я понял мою неверную интерпретацию \ s

Чтобы написать мой ожидаемый результат:

text1 for test azae:aaz azea: zae azeaz :zae eaz:  zeazea azeaz  :zae
text2 for test azae:aaz azea:   zae azeaz   :zae eaz:       zeazea azeaz        :zae
text3 for test azae:
aze

должно стать

text1 for test azae: aaz azea: zae azeaz: zae eaz: zeazea azeaz: zae
text2 for test azae: aaz azea: zae azeaz: zae eaz: zeazea azeaz: zae
text3 for test azae:
aze

Как @Yunnosch сказал, что мне нужно \ s без \ n

Я пытаюсь:

textreg = text.replace(new RegExp(/(\s)*[\:]([\s^\n])*/g,''),": ")

но в этом случае

azae:aaz

становится

azae: 

1 Ответ

1 голос
/ 29 марта 2019

В вашем шаблоне (\s)*[\:]([\s^\n])* вы используете класс символов [\s^\n], который будет соответствовать символу пробела, ^ и символу новой строки. (Обратите внимание, что \s также соответствует новой строке)

Таким образом, новая строка после text3 for test azae: также будет сопоставлена, и вы получите text3 for test azae: aze

Похоже, вы хотите удалить пробелы или символы табуляции до и после двоеточия и получить двоеточие, за которым следует один пробел.

В этом случае вы можете использовать:

[ \t]*:[ \t]*

И в качестве замены используйте двоеточие, за которым следует один пробел :

Regex101 demo

Ваш код может выглядеть следующим образом (вы можете опустить флаг /i)

text.replace(/[ \t]*:[ \t]*/g, ": ")

Обратите внимание , что, если вы намеревались использовать \s и хотели исключить из него символ новой строки, используя ^ для его отрицания, вы можете поместить его в начало класса символов и использовать этот шаблон вместо которого \S будет соответствовать непробельному символу:

[^\S\n\r]*:[^\S\n\r]*

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