- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一些字符串内容,我必须拆分。首先,我需要将字符串内容拆分成行。
我是这样做的:
str.split('\n').forEach((item) => {
if (item) {
// TODO: split also each line into sentences
let data = {
type : 'item',
content: [{
content : item,
timestamp: Math.floor(Date.now() / 1000)
}]
};
// Save `data` to DB
}
});
但现在我还需要将每一行拆分成句子。对我来说,困难在于正确拆分它。因此我会使用 .
(点和空格)来分割线。但是还有一组缩写,不应该拆分行:
cont abbr = ['vs.', 'min.', 'max.']; // Just an example; there are 70 abbrevations in that array
...还有一些规则:
1.
、2.
、30.
、 A.
, b.
Max。 Lorem ipsum
不应拆分。 Lorem 最大值。 ipsum
要么。示例
const str = 'Just some examples:\nThis example has min. 2 lines. Max. 10 lines. There are some words: 1. Foo and 2. bar.';
结果应该是四个数据对象:
{ type: 'item', content: [{ content: 'Just some examples:', timestamp: 123 }] }
{ type: 'item', content: [{ content: 'This example has min. 2 lines.', timestamp: 123 }] }
{ type: 'item', content: [{ content: 'Max. 10 lines.', timestamp: 123 }] }
{ type: 'item', content: [{ content: 'There are some words: 1. Foo and 2. bar.', timestamp: 123 }] }
最佳答案
您可以先检测字符串中的缩写和编号,然后将每个字符串中的点替换为虚拟字符串。在剩余点上拆分字符串后,表示句子结束,您可以恢复原始点。有了句子后,您可以像在原始代码中那样用换行符拆分每个句子。
更新后的代码允许在缩写中使用多个点(如 p.o.
和 s.v.p.
所示)。
var i, j, strRegex, regex, abbrParts;
const DOT = "_DOT_";
const abbr = ["p.o.", "s.v.p.", "vs.", "min.", "max."];
var str = 'Just some examples:\nThis example s.v.p. has min. 2 lines. Max. 10 lines. There are some words: 1. Foo and 2. bar. And also A. p.o. professional letters.';
console.log("String: " + str);
// Replace dot in abbreviations found in string
for (i = 0; i < abbr.length; i++) {
abbrParts = abbr[i].split(".");
strRegex = "(\\W*" + abbrParts[0] + ")";
for (j = 1; j < abbrParts.length - 1; j++) {
strRegex += "(\\.)(" + abbrParts[j] + ")";
}
strRegex += "(\\.)(" + abbrParts[abbrParts.length - 1] + "\\W*)";
regex = new RegExp(strRegex, "gi");
str = str.replace(regex, function () {
var groups = arguments;
var result = groups[1];
for (j = 2; j < groups.length; j += 2) {
result += (groups[j] === "." ? DOT + groups[j+1] : "");
}
return result;
});
}
// Replace dot in numbers found in string
str = str.replace(/(\W*\d+)(\.)/gi, "$1" + DOT);
// Replace dot in letter numbering found in string
str = str.replace(/(\W+[a-zA-Z])(\.)/gi, "$1" + DOT);
// Split the string at dots
var parts = str.split(".");
// Restore dots in sentences
var sentences = [];
regex = new RegExp(DOT, "gi");
for (i = 0; i < parts.length; i++) {
if (parts[i].trim().length > 0) {
sentences.push(parts[i].replace(regex, ".").trim() + ".");
console.log("Sentence " + (i + 1) + ": " + sentences[i]);
}
}
关于javascript - 将字符串拆分为行和句子,但忽略缩写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39903391/
我想看看我的表中使用了哪些月份。我可以获得 id 和名称(见下文)没问题,但我无法提取 abrv。我在使用 %b 之前已经完成了,但似乎无法在此处获得语法。我哪里错了? SELECT DIST
我记得 PaulP 展示了一个很酷的技巧来缩写重复的长 @specialized序列,但我找不到原来的帖子了。就像我有 trait Foo[@specialized(Int, Float, Doubl
此 C# 声明的等效 F# 声明是什么: 使用 NR = ICSharpCode.NRefactory; 最佳答案 F# 中的缩写可以应用于模块: module ES = Microsoft.FSha
我正在 emacs 中编辑 Mathematica 代码。 Mathematica 对希腊字母的明文表示看起来像 \[Alpha], \[Beta], \[Gamma], ... 我不介意输入这些,但
我从 GMT 偏移量(以秒为单位)开始,我想要相应时区的名称。我是说: let offset = -28800 let tz = TimeZone(secondsFromGMT: offset) le
我正在 emacs 中编辑 Mathematica 代码。 Mathematica 对希腊字母的明文表示看起来像 \[Alpha], \[Beta], \[Gamma], ... 我不介意输入这些,但
对于kubectl describe我可以简写几类资源,例如: po/xxx -> pods/xxx rs/xxx -> replicasets/xxx 我在哪里可以找到完整列表? 我正在尝试查找部署
当 id 是我们对目标的全部了解时,将 UUID 缩写为在用户界面中的按钮中使用的好方法是什么? GitHub 似乎通过从开头取 7 个字符来缩写提交 ID。例如 b1310ce6bc3cc932ce
这个 C/C++ 简化测试用例: int x = ~~~; const double s = 1.0 / x; const double r = 1.0 - x * s; assert(r >= 0)
如果我有一个具有许多共享相同属性约束的属性的类,如下所示: class myClass { String thisString String thatString String
我正在研究 Java Card (SIM),并且正在使用 OTA 技术。有些表达方式我还没有一个很好的定义。 例如,当我在 SIM(用户身份模块)上加载小程序时,我使用 BIP 或 SMS。我知道短信
这个问题与这个问题是同一个问题(但是对于log4j2): log4j: abbreviate/shorten package names 最佳答案 这非常简单,记录在 http://logging.a
这个 C/C++ 简化测试用例: int x = ~~~; const double s = 1.0 / x; const double r = 1.0 - x * s; assert(r >= 0)
我刚刚查看了下面列出的 gcc-arm-none-eabi 编译器二进制文件,但我真的不知道所有使用的缩写。我想知道哪个二进制文件是预处理器、链接器、编译器等等... $ ls /opt/gcc-ar
缩写 UBER 是什么意思?我知道 UBER 是 BouncyCaSTLe-Keystore 等,但我不知道缩写是什么意思。 谢谢 最佳答案 我认为这是对德语单词“Über”(over 或 super
代码应该打印用户的姓名缩写,但代码有一个错误,而是打印出整个名称,每个字母之间有空格。我知道错误存在于 for 循环中,但我不知道如何调试这个问题。建议? int main(void) { prin
当我尝试在 for 循环中使用“i < n”时,出现错误(准确地说是 4)。如果我把它拿出来,我就会陷入无限循环。我似乎也无法运行 if 语句。对我可以改进的地方有什么想法吗? int main()
有没有办法缩写以下内容? if ($chk == 1 || $chk == 3 || $chk == 5 || $chk == 7){ do some stuff } 谢谢。 最佳答案 if (in_
如何在使用 log4j 生成的日志中缩写/缩短包名称。即,我想要 c.l.a.l.MyClass 而不是 com.longpackage.anotherpackage.lastpackage.MyCl
我正在使用 ReSharper 并试图遵守它的默认规则。 在我的部分代码中,我需要将字符串属性更改为 PascalCase。 我尝试了多种方法,但找不到一种适用于所有大写缩写的方法。 前任: MPSU
我是一名优秀的程序员,十分优秀!