javascript - 反应 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
按照我希望的结果所示放置,但必须考虑以下情况。
- 如果该点之后没有任何内容,则无需放置
\n
. - 如果在该期间之后还有另一个期间,您必须将
\n
唯一放在最后一个期间之后,例如当有两个或三个暂停点时(如我在文件中考虑的最后两种情况)。
链接:https ://codesandbox.io/s/zealous-robinson-ov34m?file=/src/App.js
你能帮我个忙吗?
解决方案
负前瞻可能是一种解决方案。
以下替换单个的序列,.
但.\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."
推荐阅读
- c - Bash:通过 shell 变量将参数传递给 C 程序。如何处理空格和引号字符?
- ios - SwiftUI NavigationLink 从不释放内存
- python - 通过 Python 运行 SAS 代码以登录到特定的 SAS 数据库
- c# - 网络应用程序中的 Cookie 被删除
- swift - selectItem 时的集合视图布局错误(Swift 5)
- swift - 在 String 中创建 NSRange 时崩溃
- php - 默认情况下,如何在 unirest for php 中将响应主体类型 stdObject 更改为关联数组
- xcode - 在 Xcode 中运行的 Build 和 Build 有什么区别
- firebase - Getter uid 在 Flutter Fire 中被调用为 null
- python - 无法让 Selenium WebDriver 在 Mac 上工作