我知道有很多次问过类似的问题,但我的正则表达知识非常糟糕,而我无法让它适用于我的案例。 所以这就是我想要做的事情:
我有一个文字,我想分开句子。每个句子都以一些空格和句号结尾(句点之前可以有一个或多个空格,但总有至少一个)。
一开始我使用了/\s+\./
,它很适合分隔句子,但后来我注意到有这样的情况:
"一些文字。一些文字"。
现在,我不想将引号中的文字分开。我搜索并发现了许多适用于空间的解决方案(例如:/(".*?"|[^"\s]+)+(?=\s*|\s*$)/)
,但我无法修改它们以通过空格和句点分隔。
这是我目前正在使用的代码。
var regex = /\s+\./;
var result = regex.exec(fullText);
if(result == null) {
break;
}
var length = result[0].length;
var startingPoint = result.index;
var currentSentence = fullText.substring(0,startingPoint).trim();
fullText = fullText.substring(startingPoint+length);
我将句子逐一分开并将其从全文中删除。
length
var表示需要删除的部分的大小,startingPoint
是该部分开始的位置。该代码是较大while
周期的一部分。
答案 0 :(得分:1)
您可以尝试匹配分隔符之间的所有句子,而不是分裂。在这种情况下,更容易跳过引号中的分隔符。相应的正则表达式是:
(.*?(?:".*?".*?)?|.*?)(?: \.|$)
演示:https://regex101.com/r/iS9fN6/1
然后可以在这个循环中检索句子:
while (match = regex.exec(input)) {
console.log(match[1]); // each next sentence is in match[1]
}
BUT!这个特殊的表达式使regex.exec(input)
无限地返回true! (看起来像是另一个SO问题的候选人。)
所以我只能建议从表达式中删除$
的解决方法。这将导致正则表达式错过最后一部分,后者可能被提取为与正则表达式不匹配的预告片:
var input = "some text . some text . \"some text . some text\" some text . some text";
//var regex = /(.*?(?:".*?".*?)?|.*?)(?: \.|$)/g;
var regex = /(.*?(?:".*?".*?)?|.*?) \./g;
var trailerPos = 0;
while (match = regex.exec(input)) {
console.log(match[1]); // each next sentence is in match[1]
trailerPos = match.index + match[0].length;
}
if (trailerPos < input.length) {
console.log(input.substring(trailerPos)); // the last sentence in
// input.substring(trailerPos)
}
<强>更新强>
如果句子跨越多行,则正则表达式将无效,因为.
模式与换行符不匹配。在这种情况下,只需使用[\s\S]
代替.
:
var input = "some \ntext . some text . \"some\n text . some text\" some text . so\nm\ne text";
var regex = /([\s\S]*?(?:"[\s\S]*?"[\s\S]*?)?|[\s\S]*?) \./g;
var trailerPos = 0;
var sentences = []
while (match = regex.exec(input)) {
sentences.push(match[1]);
trailerPos = match.index + match[0].length;
}
if (trailerPos < input.length) {
sentences.push(input.substring(trailerPos));
}
sentences.forEach(function(s) {
console.log("Sentence: -->%s<--", s);
});
答案 1 :(得分:0)
在发送和接收时使用javascript的编码和解码。