正则表达式包含URL字符串内的字母数字匹配

问题描述 投票:1回答:3

鉴于一些情况下,我怎么能匹配,并提取包含URL字符串中的字母数字字符(和符号)?我目前使用谷歌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的正则表达式,如果可能的话

javascript regex google-apps-script
3个回答
2
投票

我们可以捕获任何连续文本排除使用此正则表达式是什么样子的URL,

(?:^|\s+)((?:(?!:\/\/).)*)(?=\s|$)

说明:

  • (?:^|\s) - 匹配行开始或一个或多个空格
  • ((?:(?!:\/\/).)*) - 匹配除包含://字面上识别它作为一个URL的一个任意文本
  • (?=\s|$) - 正向前查找以确保它是在一个空格或行结束

Demo

这符合并捕获除了网址的所有文字顺序。希望这对你的作品。

以下是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


1
投票

一种可能是匹配,直到你遇到使用一个基团或正向前查找第一个网址。

使用正向前查找可能看起来像:

\bTesting: .*?(?=\s*(?:https?|ftps?):\/\/)

const regexLookahead = /\bTesting: .*?(?=\s*(?:https?|ftps?):\/\/)/;
[
  "Testing: Stack Overflow Title 123? https://www.stackoverflow.com",
  "https://www.stackoverflow.com Testing: Stack Overflow Title 123? https://www.stackoverflow.com"
].forEach(s => console.log(s.match(regexLookahead)[0]));

使用捕获组,其中你的价值将是第一个捕获组:

(\bTesting: .*?)\s*(?:https?|ftps?):\/\/

const regexGroup = /(\bTesting: .*?)\s*(?:https?|ftps?):\/\//;
[
  "Testing: Stack Overflow Title 123? https://www.stackoverflow.com",
  "https://www.stackoverflow.com Testing: Stack Overflow Title 123? https://www.stackoverflow.com"
].forEach(s => console.log(s.match(regexGroup)[1]));

如果你想保留以外的所有网址,你可以匹配他们和一个空字符串替换:

\s*(?:https?|ftps?):\/\/\S+

[
  "Testing: Stack Overflow Title 123? https://www.stackoverflow.com",
  "https://www.stackoverflow.com Testing: Stack Overflow Title 123? https://www.stackoverflow.com",
  "https://www.stackoverflow.com test https://www.stackoverflow.com test https://www.stackoverflow.com test",
  "https://www.stackoverflow.com test",
  "test https://www.stackoverflow.com"
].forEach(s => console.log(s.replace(/\s*(?:https?|ftps?):\/\/\S+/g, '').trim()));

0
投票

可以使用.split()空格字符和.filter()所得阵列以排除其与指定的协议开始的元件或与字结束然后点字符然后字和字符串的结尾

const splitURL = s => s.split` `.filter(w => !/^\w+(?=:\/\/)|\w+\.\w+$/.test(w)).join` `;
 
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";

console.log(splitURL(scenario1), splitURL(scenario2));

推荐问答