javascript - 用于匹配包含 URL 的字符串中的字母数字的正则表达式

标签 javascript regex google-apps-script

给定几个场景,我如何匹配和提取包含 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|$) - 正向前瞻以确保其后跟一个空格或行尾

Demo

这会匹配并捕获除 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|$)

Demo with your title character set

关于javascript - 用于匹配包含 URL 的字符串中的字母数字的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54495652/

相关文章:

Java正则表达式解析字符串的中间值

python - 如何在正则表达式中查找连续重复?

python - regEx 在 notepad++ 中有效,但在 python 中无效

php - MySQL位数据类型php打印unicode怎么来的?

javascript - 在窗体上阻塞 'submit'

javascript - 基于复选框添加和删除 URL 参数

来自对象数组的 Javascript/Lodash 深度比较对象

google-apps-script - 使用 Google 脚本将列中空单元格的值设置为相邻列中的日期(作为字符串)

google-apps-script - 序列化延续 Google Apps 脚本时出现意外异常

google-apps-script - 使用Google脚本从地址数据中获取地理位置数据