匹配一个“"在特定图案之后,同时排除该图案.(JavaScript中的lookbacking)
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"]
要匹配的","具有以下规则:
- 它至少有一个或多个前面或后面的空格(例如(''s+,''s*|''s*,''s+)
- 它是一个或多个空格后的第一个",",后面跟着一些其他字符(即:''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);
}
}
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 在chrome.tabs.onCreated之后加载HTML页面
- 在Jquery detachment()和appendTo()之后定位元素
- AngularJS:ng之后,重复$scope值未按预期更新
- 为什么元素的宽度在页面加载之后和那一刻之后不同
- 没有在Angular应用程序中定义firebase(在firebase迁移之后)
- Javascript复选框函数:;缺少:在属性id之后"
- 在刚刚调用的append函数之后,jquery.height()不会返回实际值
- 正在链接添加了以下内容::在之后
- JQuery hide()在show()之后不起作用,反之亦然
- 未执行Ajax循环的Javascript之后的代码
- 如何在`window.open`之后执行回调
- 如何在一个元素动画之后延迟
- 在XMLHttpRequest之后重新初始化jQuery
- 如何实施积极的“;lookbacking”;Javascript中的正则表达式
- <text区域>在我的html中包含event.keycode==13之后,wrap就不起作用了
- 在jAlert之后设置焦点
- 在Javascript中的ajax响应之后未调用Dropdown事件
- web浏览器中的离线应用程序存储数据并在之后上传
- 匹配一个“"在特定图案之后,同时排除该图案.(JavaScript中的lookbacking)