按空格拆分字符串和未用引号

时间:2016-08-24 11:55:02

标签: javascript regex

我知道有很多次问过类似的问题,但我的正则表达知识非常糟糕,而我无法让它适用于我的案例。 所以这就是我想要做的事情:

我有一个文字,我想分开句子。每个句子都以一些空格和句号结尾(句点之前可以有一个或多个空格,但总有至少一个)。

一开始我使用了/\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周期的一部分。

2 个答案:

答案 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的编码和解码。