首页 > 解决方案 > 反应 js 创建 json 文件,读取仅在句子的最后一点之后换行

问题描述

文件:

WEBVTT

00:00:00.000 --> 00:00:12.920
Hi.
Hi.

00:00:26.040 --> 00:00:26.960
Hi.

00:00:26.040 --> 00:00:26.960
Hi.Hi

00:00:26.040 --> 00:00:26.960
Hi..Hi

00:00:26.040 --> 00:00:26.960
Hi...Hi.

我的结果json:

[
    {
        "timeString": "00:00:00.000 --> 00:00:12.920",
        "from": "00:00:00.000",
        "to": "00:00:12.920",
        "string": "Hi.\nHi."
    },
    {
        "timeString": "00:00:26.040 --> 00:00:26.960",
        "from": "00:00:26.040",
        "to": "00:00:26.960",
        "string": "Hi."
    },
    {
        "timeString": "00:00:26.040 --> 00:00:26.960",
        "from": "00:00:26.040",
        "to": "00:00:26.960",
        "string": "Hi.Hi"
    },
    {
        "timeString": "00:00:26.040 --> 00:00:26.960",
        "from": "00:00:26.040",
        "to": "00:00:26.960",
        "string": "Hi..Hi"
    },
    {
        "timeString": "00:00:26.040 --> 00:00:26.960",
        "from": "00:00:26.040",
        "to": "00:00:26.960",
        "string": "Hi...Hi."
    }
]

Json结果期望:

[
    {
        "timeString": "00:00:00.000 --> 00:00:12.920",
        "from": "00:00:00.000",
        "to": "00:00:12.920",
        "string": "Hi.\nHi."
    },
    {
        "timeString": "00:00:26.040 --> 00:00:26.960",
        "from": "00:00:26.040",
        "to": "00:00:26.960",
        "string": "Hi."
    },
    {
        "timeString": "00:00:26.040 --> 00:00:26.960",
        "from": "00:00:26.040",
        "to": "00:00:26.960",
        "string": "Hi.\nHi" <- different
    },
    {
        "timeString": "00:00:26.040 --> 00:00:26.960",
        "from": "00:00:26.040",
        "to": "00:00:26.960",
        "string": "Hi..\nHi" <- different
    },
    {
        "timeString": "00:00:26.040 --> 00:00:26.960",
        "from": "00:00:26.040",
        "to": "00:00:26.960",
        "string": "Hi...\nHi." <- different
    }
]

代码:

export default function App() {
  fetch("/file.txt")
    .then((r) => r.text())
    .then((text) => {
      const v = text
        .replace("WEBVTT", "")
        .replace(/[\r\n]{2,}/g, "\n")
        .replace("\n", "");
      const lines = v.split("\n");

      let inc = -1;
      const sub = lines.reduce((acc, d, index, array) => {
        const test = new RegExp("\\b(\\d{2}:\\d{2}:\\d{2})\\.(\\d{3})\\b").test(
          d
        );
        if (test) {
          inc++;
          const a = d.split("-->").filter((e) => e !== "-->");
          acc.push({ timeString: d, from: a[0].trim(), to: a[1].trim() });
        } else {
          let a = acc[inc]?.string;
          if (a !== undefined) a += `\n${d}`;
          else a = d;
          acc[inc] = { ...acc[inc], string: a };
        }
        return acc;
      }, []);
      console.log(sub);
    });

  return <div className="App"></div>;
}

我想得到的结果是,只要在文件中作为文本,所以字符串字段中的单词或短语以句号结尾,它就会\n按照我希望的结果所示放置,但必须考虑以下情况。

  1. 如果该点之后没有任何内容,则无需放置\n.
  2. 如果在该期间之后还有另一个期间,您必须将\n唯一放在最后一个期间之后,例如当有两个或三个暂停点时(如我在文件中考虑的最后两种情况)。

链接:https ://codesandbox.io/s/zealous-robinson-ov34m?file=/src/App.js

你能帮我个忙吗?

标签: javascriptreactjsfilereducesubtitle

解决方案


负前瞻可能是一种解决方案。

以下替换单个的序列,..\n仅当它后面没有任何.或新行(\n),并且后面没有序列结束($):

const finder = /\.(?![\n.])(?!$)/g;
const mangle = (str) => str.replace(finder, '.\n');

console.log(mangle('Hi.\nHi.')); // "Hi.\nHi."
console.log(mangle('Hi.'));      // "Hi."
console.log(mangle('Hi.Hi'));    // "Hi.\nHi"
console.log(mangle('Hi..Hi'));   // "Hi..\nHi"
console.log(mangle('Hi...Hi.')); // "Hi...\nHi."


推荐阅读