给定几个场景,我如何匹配和提取包含 URL 的字符串中的字母数字字符(和符号)?我目前正在使用 Google Apps 脚本从 Gmail 线程消息中检索超链接文本的纯正文文本,我基本上想匹配并从一些字符串中提取标题,如下所示:
var scenario1 = "Testing: Stack Overflow Title 123? https://www.stackoverflow.com";
...我只想输出:"Testing: Stack Overflow Title 123?"
这是另一种情况:
var scenario2 = "https://www.stackoverflow.com Testing: Stack Overflow Title 123? https://www.stackoverflow.com";
...再次,我只想输出:"Testing: Stack Overflow Title 123?"
我已经尝试了以下初始测试以查看字符串是否首先包含一个 URL(我在其中确认用于匹配 URL 的正则表达式有效并输出:https://www.stackoverflow.com
),然后测试标题是否存在以最终提取它,但无济于事:
var scenario1 = "Testing: Stack Overflow Title 123? https://www.stackoverflow.com";
var scenario2 = "https://www.stackoverflow.com Testing: Stack Overflow Title 123? https://www.stackoverflow.com";
var urlRegex = /(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/;
var titleRegex = /^[a-zA-Z0-9_:?']*$/;
var containsUrl = urlRegex.test(element);
if (containsUrl) {
var containsTitle = titleRegex.test(scenario1);
if (containsTitle) { // No match, and doesn't run
var title = titleRegex.exec(element)[0];
Logger.log("title: " + title);
}
}
基本上,如果可能的话,我想要一个匹配除 URL 之外的所有内容的 Regex 模式
最佳答案
我们可以使用此正则表达式捕获任何顺序文本,但不包括看起来像 URL 的内容,
(?:^|\s+)((?:(?!:\/\/).)*)(?=\s|$)
解释:
(?:^|\s)
- 匹配行首或一个或多个空格((?:(?!:\/\/).)*)
- 匹配任何文本,但包含://
字面标识为一个网址(?=\s|$)
- 正向前瞻以确保其后跟一个空格或行尾
这会匹配并捕获除 URL 之外的任何顺序文本。希望这对你有用。
这是一个 Javascript 演示。
var arr = ['Testing1: Stack Overflow Title 123? https://www.stackoverflow.com','https://www.stackoverflow.com Testing2: Stack Overflow Title xyz? https://www.stackoverflow.com Hello this is simple text ftp://www.downloads.com/']
for (s of arr) {
var reg = /(?:^|\s+)((?:(?!:\/\/).)*)(?=\s|$)/g;
match = reg.exec(s);
while (match != null) {
console.log(match[1])
match = reg.exec(s);
}
}
此外,正如我所见,您想限制匹配标题中的字符,您可以使用字符集 [a-zA-Z0-9_:?' ]
(在你的字符集中添加空格以允许捕获空格)而不是 .
在我的正则表达式中并使用以下正则表达式更精确以避免捕获具有意外字符的标题,
(?:^|\s+)((?:(?!:\/\/)[a-zA-Z0-9_:?' ])*)(?=\s|$)
关于javascript - 用于匹配包含 URL 的字符串中的字母数字的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54495652/