我正在寻找一个正则表达式将用户提供的字符串拆分为:字符,但是当用户转义了冒号\:或它是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的匹配解决方案,因为这样做更优雅。

07-25 21:48