【问题标题】:Splitting JavaScript string using an unknown length string such as \n使用未知长度字符串拆分 JavaScript 字符串,例如 \n
【发布时间】:2019-09-28 12:43:49
【问题描述】:

我有一个从后端生成的字符串,在不同的位置具有未知长度的\n。意思是我有类似的东西:

Lorem Ipsum\n\n\dolor sit amet\n\n\n\n\n,consecteur adipiscing\nelit

有没有办法使用随机长度\n 字符将此字符串拆分为数组?

编辑:以下是一些额外的技术细节:

我正在使用Apache POIJEE 来解析word 文档,因此我作为响应返回的字符串是由库生成的,我无法控制它。我已经浏览了库使用的类,它确实在完成解析段落时添加了\n 字符,它还为标题和副标题添加了\t 字符,这是一个最小化的字符串示例返回:

“I.\tIntroduction\t3\nII.\tECMA 国际:\t3\nIII.\tECMAScript & JavaScript :\t3\nIV.\tEditions ECMAScript :\t4\nV.\tECMAScript 2015 :\t5\na.\tNouvelles fonctionnalités « Number » et « Math » :\t5\n�?�\tEntiers Littéraux :\t5\n�?�\tNouvelles propriétés pour les 对象«数»和«数学»:\t5\nb.\tNouvelles fonctionnalités pour 文件字符串:\t6\nc.\tLet & Const :\t6\n�?�\tLet :\t7\n�?�\tConst :\t8\nd.\tFonctions fléchées:\t8\ne.\tClasses:\t10\n�?�\tDéfinition d�??une 类:\t10\n�?�\tHéritage:\t11\n�?�\tMéthodes et propriétés statiques:\t12\n�?�\tGetters & 设置器:\t12\nf.\tModules:\t13\ng.\tParamètres par 默认:\t14\nh.\tLa boucle For-Of :\t14\ni.\tGénérateurs :\t15\nj.\t承诺:\t15\nVI.\t结论:\t18\nVII.\t书目:\t19\n\n\n\n"

这表示文档的摘要(整个字符串的一部分)。

将这个字符串直接传递给一个 split 是可行的,但是像下面这样传递返回的数据却不行:

ajax.post('tech/technology',`technology=${id}`)
.then((data) => {
    console.log(data.response.split(/\n+/));
})

【问题讨论】:

  • 好吧,它适用于您的示例,如果您不显示它,我们无法看到整个文本的不适用。
  • @Toto 整个文本太长,无法粘贴到此处,我注意到的问题不在于文本本身。我试图将它直接从不起作用的响应中拆分出来(它记录了一个包含 2 个值的数组、字符串本身和一个空字符串),但是如果我复制整个字符串并将其传递给一个变量并拆分它,它有效。所以问题是这个data.response在解析时不是一个格式良好的字符串?

标签: javascript regex string split


【解决方案1】:

只需在 \n+ 的正则表达式上拆分,这会将字符串拆分为一个或多个 \n 字符:

const str = 'Lorem Ipsum\n\n\dolor sit amet\n\n\n\n\n,consecteur adipiscing\nelit';
console.log(str.split(/\n+/));

请注意,拆分单个 \n 字符然后过滤掉空字符串实际上可能更有效(从而避免使用正则表达式):

const str = 'Lorem Ipsum\n\n\dolor sit amet\n\n\n\n\n,consecteur adipiscing\nelit';

console.log(str.split('\n').filter(Boolean));

【讨论】:

  • 您的答案似乎适用于短字符串。我的字符串很长,这种方法不起作用。
  • @Amine:怎么不工作?你的弦有多长?你得到什么错误?
  • @Toto 我没有收到任何错误,我将使用我正在使用的代码更新我的原始帖子。
  • @Amine 很抱歉没有回应 - 一直在这里,也许这个字符不是换行符,而是实际上是一个文字反斜杠,后跟一个 n?你可以试试str.split(/(?:\\n)+/) 看看有什么作用吗?
  • @Nick 是的,就是这样,\n 实际上是一个反弹,后面跟着一个n。我通过用 .split(/\\n+/) 替换你的正则表达式来修复它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
相关资源
最近更新 更多