簡體   English   中英

排除特定模式后,在特定模式后匹配“,”。 (在JavaScript中落后)

[英]Match a “,” after a specific pattern while excluding this pattern. (lookbehind in JavaScript)

我需要在某些“,”符號上拆分如下所示的模式。

輸入:

"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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM