gpt4 book ai didi

Javascript 字符串用正则表达式分割

转载 作者:行者123 更新时间:2023-11-27 23:33:31 30 4
gpt4 key购买 nike

我正在尝试使用链接(url)的正则表达式来分割字符串。

有问题的正则表达式是

var regex = new RegExp('(?:^(?:(?:[a-z]+:)?//)(?:\S+(?::\S*)?@)?(?:localhost|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:[/?#]\S*)?$)')

如果我这样做

regex.test("https://google.com"); // returns true

但是正在做-

"Go to https://google.com".split(regex); 
// return ["Go to https://google.com"]

而我希望它返回

["Go to ", "https://google.com"]

知道这里发生了什么吗?

最佳答案

首先,您使用字符串文字来构建正则表达式,这意味着您必须转义反斜杠(因为反斜杠在字符串中具有特殊含义,用于换行符 \n 例如):

var regex = new RegExp('(?:^(?:(?:[a-z]+:)?//)(?:\\S+(?::\\S*)?@)?(?:localhost|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:[/?#]\\S*)?$)');

另一种解决方案是使用正则表达式文字,正如 JavaScript 所建议的那样,但您必须转义斜杠:

var regex = /(?:^(?:(?:[a-z]+:)?\/\/)(?:\S+(?::\S*)?@)?(?:localhost|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:[\/?#]\S*)?$)/;
<小时/>

然后,由于 ^ and $ anchors,您的正则表达式将尝试匹配整个输入。 。因此,如果您删除它们(或者更好的是,将它们替换为 word boundaries \b),您将能够在字符串中找到 URL,例如:

var regex = /(?:\b(?:(?:[a-z]+:)?\/\/)(?:\S+(?::\S*)?@)?(?:localhost|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:[\/?#]\S*)?\b)/;
<小时/>

但是,要点是您误解了 split 概念。给定字符串 "hello world",如果按空格分割,最终会得到 ["hello", "world"]:不再有空格了是用于分割的字符。

也就是说,如果您按 URL 正则表达式进行拆分,则输出数组将不再包含 URL。在我看来,前瞻可以满足您的需求:

var regex = /(?=(?:\b(?:(?:[a-z]+:)?\/\/)(?:\S+(?::\S*)?@)?(?:localhost|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:[\/?#]\S*)?\b))/;
"Go to https://google.com".split(regex) // ["Go to ", "https://google.com"]

正则表达式解释:

(?=(?:\b(?:(?:[a-z]+:)?//)(?:\S+(?::\S*)?@)?(?:localhost|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:[/?#]\S*)?\b))

Regular expression visualization

Debuggex Demo

通过使用正向先行 (?=content_of_lookahead) 拆分字符串,您将按每个后跟先行内容的 interchar 进行拆分。

关于Javascript 字符串用正则表达式分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34337599/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com