[英]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"]
要匹配的“,”具有以下規則:
第二種模式的問題在於,它還包括“ 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"]
只是想提供一種不使用正則表達式的方法。 看到如此簡單的任務需要多少代碼,這真是令人印象深刻。
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.