繁体   English   中英

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

[英]Javascript string split with regex

我试图使用链接(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"]

知道这里发生了什么吗?

首先,您使用字符串文字来构建您的正则表达式,这意味着您必须转义反斜杠(因为反斜杠在字符串中具有特殊含义,例如用于换行符char \\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*)?$)/;

然后,由于^$ anchors ,您的正则表达式将尝试与整个输入匹配。 因此,如果删除它们(或者最好用单词边界 \\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"]结尾:由于用于分割的char是不再有空格。

也就是说,如果按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))

正则表达式可视化

Debuggex演示

通过以正前瞻(?=content_of_lookahead)拆分字符串,您(?=content_of_lookahead)每个interchar进行拆分,后跟先行内容。

看一下您应该知道的8个正则表达式

要匹配网址,您可以使用以下正则表达式:

var regex = "(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w# \.-]*)*\/?$";

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

现场例子

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM