最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】替换掉VSCode中显示出的特殊字符:NAK

VSCode crifan 10348浏览 0评论

现有一个文件,用VSCode打开,发现里面:

显示出了NAK这种特殊不可见字符:

(注:

之前一直是开启显示控制字符:

所以此处才能看到这些特殊的,不可见的,控制字符的)

NAK

此处需要:

搞清楚NAK的含义

以及:

替换掉:

NAK\d+_\d+NAK

为空

之前自己整理过,

所以去找:

crifan 不可见字符

ASCII字符集中的功能/控制字符 Function/Control Code/Character in ASCII v2011-10-12 – 在路上

进制
十六
进制
控制
字符
转义
字符*
说明
Ctrl + 
下列字母 *
21
15
NAK
Negative Acknowledgement(拒绝接收/无响应)
U

3.11. Notepad++支持插入特殊字符 – – 【crifan推荐】轻量级文本编辑器,Notepad最佳替代品:Notepad++

21是NAK=Negative Acknowledgement(拒绝接收/无响应)

所以接着就是去搞清楚:

VSCode中的正则,如何输入表达

ASCII中特殊的不可见字符NAK

或者说  unicode字符

VSCode 正则 特殊字符

继续参考之前找到的:

Basic Editing in Visual Studio Code

->

BurntSushi/ripgrep: ripgrep recursively searches directories for a regex pattern

->

regex – Rust

去看看,如何写unicode字符

好像可以参考:

<code>\x7F       hex character code (exactly two digits)
</code>

去写hex 16进制值,试试

ASCII的NAK=10进制是12=16进制是0x15

结果无效:

再去参考:

<code>\x{10FFFF} any hex character code corresponding to a Unicode code point
</code>

试试unicode的code point

不过先去查查NAK的unicode的code point

unicode code point

unicode code point NAK

List of Unicode characters – Wikipedia

U+0015
21
NAK

结果:

<code>\x{0015}\d+_\d+
</code>

也不行,匹配不到:

VSCode regex special char

Not able to find special characters like \n, \r, \t · Issue #6186 · Microsoft/vscode

can’t search with unicode regular expression · Issue #39404 · Microsoft/vscode

support `\u` and `\u{…}` syntax · Issue #424 · rust-lang/regex

<code>\u0015
\u15
</code>

都不行。

VSCode regex unicode

Dealing with invalid js characters in VS Code – Code Buckets

我这里试了:

<code>\u0015
\u15
</code>

还是不行啊

Remove backspace control character – Visual Studio Marketplace

去试试

<code>[\u0015]
[\u15]
</code>

都可以的,能找到字符的:

然后去用:

<code>^[\u0015]\d+_\d+[\u0015]$

</code>

去掉这些有问题的单词

然后再去顺带把多余的空行去掉

<code>\n\n+
\n
</code>

而此处:

<code>\u0015
</code>

之所以没有生效。

后来经过自己的细心和观察和猜测:

Dealing with invalid js characters in VS Code – Code Buckets

帖子2017年的,感觉是:

\uxxxx

VSCode应该是2017年就知道了

而此处

http://codebuckets.com/2017/03/10/dealing-with-invalid-js-characters-in-vs-code/

可以

-》

而对方是js代码

-〉但是我这里不可以。

-》难道是\uxxxx只有在js代码中的才有效?

-〉之所以这么测试是因为看到了:

can’t search with unicode regular expression · Issue #39404 · Microsoft/vscode

提到了:

 one search engine uses the JavaScript regular expression syntax (albeit without the ‘u’ unicode flag),

the other is based on ripgrep which uses Rust regular expression syntax.

即:

VSCode中用了两套正则的库:

  • JS的正则表达式的库

  • ripgrep:

    • 内部是基于Rust正则表达式的库

去试了试:

把其中部分内容,拷贝出来,设置代码语法是js,然后再去试试:\u0015,还真的可以:

-》证明了我的猜测是对的。

【后记】

后来重新试了,csv文件中:

<code>\u0015
</code>

是生效的:

<code>\u0015\d+_\d+\u0015

</code>

替换为:

再去:

<code>\n\n+
\n
</code>

把文件从39M变成3.4M了:

【总结】

VSCode中,如果使用查找(和替换的话),其中用到了正则的话

-〉在搜索中,选中了那个:.* 的图标

-》

按照之前说法,好像有两套正则:

  • JS的正则

    • Regular Expressions – JavaScript | MDN

    • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions

    • -》unicode(和hex的16进制)写法是:

      • \xhh

        • Matches the character with the code hh (two hexadecimal digits)

      • \uhhhh

        • Matches the character with the code hhhh (four hexadecimal digits).

      • \u{hhhh}

        • (only when u flag is set) Matches the character with the Unicode value hhhh (hexadecimal digits).

  • 基于Rust的ripgrep

    • 调用的是:

    • regex – Rust

    • https://docs.rs/regex/1.0.1/regex/index.html

    • -》unicode(和hex的16进制)的写法是:

      • \x7F

        • hex character code (exactly two digits)

      • \x{10FFFF}

        • any hex character code corresponding to a Unicode code point

      • \u007F

        • hex character code (exactly four digits)

      • \u{7F}

        • any hex character code corresponding to a Unicode code point

      • \U0000007F

        • hex character code (exactly eight digits)

      • \U{7F}

        • any hex character code corresponding to a Unicode code point

-》不过不用操心,此处

VSCode版本是最新的:1.24.1

对于unicode,都支持:

<code>\u0015
</code>

的写法,即可找到NAK这个特殊字符了。

另外:新版Rust的unicode支持更完整:

之前0.25的旧版本的Rust:

regex – Rust

是:

<code>\x7F       hex character code (exactly two digits)
\x{10FFFF} any hex character code corresponding to a Unicode code point
</code>

 

而新版本1.0

regex – Rust

是:

<code>\x7F        hex character code (exactly two digits)
\x{10FFFF}  any hex character code corresponding to a Unicode code point
\u007F      hex character code (exactly four digits)
\u{7F}      any hex character code corresponding to a Unicode code point
\U0000007F  hex character code (exactly eight digits)
\U{7F}      any hex character code corresponding to a Unicode code point
</code>

转载请注明:在路上 » 【已解决】替换掉VSCode中显示出的特殊字符:NAK

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.164 seconds, using 22.14MB memory