我正在寻找一个正则表达式将用户提供的字符串拆分为:
字符,但是当用户转义了冒号\:
或它是URL的一部分时(例如, https://stackoverflow..
。
在javascript中,大多数浏览器尚不支持lookbehinds。是否可以对后向部分应用其他方法?
在Chrome上的clojure / Clojurescript(确实支持lookbehinds)中,此正则表达式可以解决问题:
#"(?<!\):(?!//)"
但不是在Safari中(例如)。
最佳答案
主要问题是当前浏览器不支持后向搜索,而后向搜索要求查找和否定前缀\
是必需的,因此我们不包括\:
。
一种解决方法(不是很漂亮,但是可以起作用)是先用一些您知道不会在文本中自然出现的“符号”代替\:
,然后进行拆分,然后再替代任何\:
。
例如,如果您的字符串中包含“ ::”,则此方法将返回一个空元素“”:
let regex = /:(?!\/\/)/
//original string literal \: has to be expressed as \\:
let str = "http://example.com::hello:dolly:12\\:00\\:PM";
//substitute out any \:
str = str.replace(/\\:/g,"<colon>"); //http://example.com::hello:dolly:12<colon>00<colon>PM
//now we split 'normally' without lookbehind
let arr = str.split(regex); //[ 'http://example.com', '', 'hello', 'dolly', '12\\:00\\:PM' ]
//substitute back \:
arr = arr.map(element => element.replace(/<colon>/g, "\\:")); //[ 'http://example.com', '', 'hello', 'dolly', '12\\:00\\:PM' ]
console.log(arr);
如果您只在非空元素之后,可以在其上执行
arr.filter(Boolean)
,或者仅使用@Skeeve的匹配解决方案,因为这样做更优雅。