我希望在每行前面插入str.replace(/^/gm, "\t")\t.这似乎是事实,但只有当使用LF结尾时,当使用CRLF结尾时,一些奇怪的事情发生了,它也会将其插入\r\n之间.

考虑以下示例代码:

var str1 = "First line\nnext Line";
var str2 = "First line\r\nnext Line";

function escape(str) {
  return str.replace(/[\r\n\t]/g, match => {
    return {
      '\r': '\\r',
      '\n': '\\n',
      '\t': '\\t',
    }[match]
  })
}

console.log("First string:")
console.log(escape(str1))


console.log("Second string:")
console.log(escape(str2))

function operation(str) {
  return str.replace(/^/gm, "\t");
}

console.log("First string:")
str1 = operation(str1)
console.log(escape(str1))


console.log("Second string:")
str2 = operation(str2)
console.log(escape(str2))
.as-console-wrapper {
    max-height: 100% !important;
}

在转换之后,第一个字符串如预期的那样是\tFirst line\n\tnext Line,而第二个字符串变成了\tFirst line\r\t\n\tnext Line,这在我使用的VScode Extension中产生了意想不到的行为.VSCode将分别解释\n\r,并用\n\r替换它们,这导致了不需要的格式.控制台似乎并不在意,并按预期显示它,因此使用了退出功能,以显示那些令人讨厌的回车和换行.

这是预期的行为还是javascript标准库中的错误?

推荐答案

这正是根据ECMAScript specification, 22.2.2.4 Runtime Semantics: CompileAssertion:

Assertion :: ^

  1. Return a new Matcher with parameters (x, c) that captures nothing and performs
     the following steps when called:
      a. Assert: x is a State.
      b. Assert: c is a Continuation.
      c. Let e be x's endIndex.
      d. If e = 0, or if Multiline is true and the character Input[e - 1] is one of
         LineTerminator, then
          i. Return c(x).
      e. Return failure.

Elsewhere, in Section 12.3 LineTerminator被定义为<LF> <CR> <LS> <PS>中的一个,因此\r\n实际上被视为单独的终止符.

可能最简单的修复方法是不要使用m标志,而是自己匹配所有类型的行结束符(包括过go 在Mac上使用的\r):

>>> "foo\rbar\r\nbaz\nqux".replace(/(^|\r\n|\r|\n)/g, "$1\t")
"\tfoo\r\tbar\r\n\tbaz\n\tqux"

请注意,\r\n必须在\r之前,以便将其作为一个单元进行匹配.

Javascript相关问答推荐

使用useup时,React-Redux无法找到Redux上下文值

通过在页面上滚动来移动滚动条

在页面上滚动 timeshift 动垂直滚动条

Angular中计算信号和getter的区别

如何粗体匹配的字母时输入搜索框使用javascript?

为什么当我解析一个promise时,输出处于挂起状态?

我的服务工作器没有连接到我的Chrome扩展中的内容脚本.我该怎么解决这个问题?

JS,当你点击卡片下方的绿色空间,而它是在它的背后转动时,

如何控制Reaction路由加载器中的错误状态?

我创建了一个创建对象的函数,我希望从该函数创建的对象具有唯一的键.我怎么能做到这一点?

如何在使用rhandsontable生成表时扩展数字输入验证?

查询参数未在我的Next.js应用路由接口中定义

创建以键值对为有效负载的Redux Reducer时,基于键的类型检测

是否可以在Photoshop CC中zoom 路径项?

<;img>;标记无法呈现图像

表单数据中未定义的数组键

如何调整下拉内容,使其不与其他元素重叠?

无法向甜甜圈图表上的ChartJSImage添加可见标签

使用VITE开发服务器处理错误

如何格式化API的响应