匹配一个“"在特定图案之后,同时排除该图案.(JavaScript中的lookbacking)

Match a "," after a specific pattern while excluding this pattern. (lookbehind in JavaScript)

本文关键字:之后 lookbacking 中的 JavaScript 排除 一个 quot      更新时间:2023-09-26

我需要在一些","符号上拆分如下所示的模式。

输入:

"stri,ng1 ext,string2 ext,string3, string4 ,string5"

输出:

["stri,ng1 ext", "string2 ext", "string3", "string4", "string5"]

要匹配的","具有以下规则:

  1. 它至少有一个或多个前面或后面的空格(例如(''s+,''s*|''s*,''s+)
  2. 它是一个或多个空格后的第一个",",后面跟着一些其他字符(即:''s+(.?),''s

第二种模式的问题是,它还包括"ext"部分。如果有一个有效的模式只匹配",",那就太好了。

如果这是不可能的,至少一个简短的算法。有人能帮忙吗?

我目前不太好的模式是这样的:

's+(.*?)[^'s+],+'s*|'s*,+'s+|'s+,+'s*

虽然这只匹配右边的逗号,但它也包括"ext"部分。我怎么能把他们排除在外。

您可以在Javascript中使用以下代码:

var str = 'stri,ng1 ext,string2 ext,string3, string4 ,string5';
var m = str.replace(/ +,|, +| +([^,]*),/g, function($0, $1) {
            var p=($1!=undefined)?" "+$1:""; return(p + "##"); }).split('##');
//=> ["stri,ng1 ext", "string2 ext", "string3", "string4", "string5"]

JSFiddle演示

我也想提供一种无正则表达式的方法。看到这么简单的任务需要多少代码,真是令人印象深刻。

tokenize("stri,ng1 ext,string2 ext,string3, string4 ,string5");
//["stri,ng1 ext", "string2 ext", "string3", "string4 ", "string5"]
function tokenize(str) {
    var tokens = [],
        i = 0,
        tokenStartIndex = 0,
        spaceSeenSinceLastToken = false,
        nonSpaceSeenSinceLastToken = false,
        spacesCountSinceLastNonSpace = 0,
        SPACE = ' ',
        len = str.length,
        nextIndex, char, prevCharIsSpace, nextCharIsSpace, lastToken;
    for (; i < len; i++) {
        if (SPACE == (char = str[i])) {
            spaceSeenSinceLastToken = true;
            if (!nonSpaceSeenSinceLastToken) ++tokenStartIndex;
            else ++spacesCountSinceLastNonSpace;
            continue;
        }

        if (char != ',') {
            spacesCountSinceLastNonSpace = 0;
            nonSpaceSeenSinceLastToken = true;
            continue;
        }

        nextIndex = i + 1;
        prevCharIsSpace = str[i - 1] == SPACE;
        nextCharIsSpace = str[nextIndex] == SPACE;
        if (isDirectlyFollowedOrPrecededBySpace() || isFirstCommaPrecededBySpaceAndFollowedByNonSpace()) {
            pushToken();
            tokenStartIndex = nextIndex;
            spaceSeenSinceLastToken = nonSpaceSeenSinceLastToken = false;
            spacesCountSinceLastNonSpace = 0;
        }
    }
    pushToken();
    return tokens;
    function isDirectlyFollowedOrPrecededBySpace() {
        return prevCharIsSpace || nextCharIsSpace;
    }
    function isFirstCommaPrecededBySpaceAndFollowedByNonSpace() {
        return spaceSeenSinceLastToken && !nextCharIsSpace;
    }
    function pushToken() {
        var token = str.slice(tokenStartIndex, i - spacesCountSinceLastNonSpace);
        token && tokens.push(token);
    }
}