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

Javascript 用于在包含URL的字符串中匹配字母数字的正则表达式,javascript,regex,google-apps-script,Javascript,Regex,Google Apps Script,给定一些场景,如何在包含URL的字符串中匹配和提取字母数字字符(和符号)?我目前正在使用Google Apps脚本从Gmail线程消息中检索超链接文本的纯正文,我基本上希望匹配并从一些字符串中提取标题,如下所示: var scenario1 = "Testing: Stack Overflow Title 123? https://www.stackoverflow.com"; 。。。其中我只想输出:“测试:堆栈溢出标题123?” 下面是另一个场景: var scenario2 = "http

给定一些场景,如何在包含URL的字符串中匹配和提取字母数字字符(和符号)?我目前正在使用Google Apps脚本从Gmail线程消息中检索超链接文本的纯正文,我基本上希望匹配并从一些字符串中提取标题,如下所示:

var scenario1 = "Testing: Stack Overflow Title 123? https://www.stackoverflow.com";
。。。其中我只想输出:
“测试:堆栈溢出标题123?”

下面是另一个场景:

var scenario2 = "https://www.stackoverflow.com Testing: Stack Overflow Title 123? https://www.stackoverflow.com";
。。。同样,我只想在其中输出:
“测试:堆栈溢出标题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以外的所有内容,如果可能的话

一种可能是匹配,直到使用组或正向前瞻遇到第一个url为止

使用一个积极的前瞻,可能看起来像:

\bTesting: .*?(?=\s*(?:https?|ftps?):\/\/)
const regexLookahead=/\b测试:.*(?=\s*(?:https?| ftps?):\/\/;
[
测试:堆栈溢出标题123?https://www.stackoverflow.com",
"https://www.stackoverflow.com 测试:堆栈溢出标题123?https://www.stackoverflow.com"
].forEach(s=>console.log(s.match(regexLookahead)[0])
您可以使用
.split()
空格字符和
.filter()
结果数组来排除以指定协议开头或以单词、点字符、单词和字符串结尾的元素

const splitURL=s=>s.split```.filter(w=>!/^\w+(?=:\/\/)\124;\ w+\.\w+$/.test(w)).join`;
var scenario1=“测试:堆栈溢出标题123?https://www.stackoverflow.com";
变量场景2=”https://www.stackoverflow.com 测试:堆栈溢出标题123?https://www.stackoverflow.com";

log(splitURL(scenario1)、splitURL(scenario2))我们可以使用此正则表达式捕获任何顺序文本,不包括看起来像URL的内容

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

  • (?:^ |\s)
    -匹配行首或一个或多个空格
  • ((?:(?!:\/\/)*)
    -匹配除包含
    ://
    的文本外的任何文本,从字面上将其标识为URL
  • (?=\s |$)
    -正向前瞻,以确保后跟空格或行尾

这将匹配并捕获除URL之外的任何连续文本。希望这对你有用

这里是一个Javascript演示

var arr=['Testing1:Stack Overflow Title 123?https://www.stackoverflow.com','https://www.stackoverflow.com    测试2:堆栈溢出标题xyz?https://www.stackoverflow.com 你好,这是简单的文本ftp://www.downloads.com/']
适用于(arr的s){
var reg=/(?:^\s+)(?:(?!:\/\)*)(?=\s$)/g;
匹配=注册执行官;
while(匹配!=null){
console.log(匹配[1])
匹配=注册执行官;
}

}
是否可以有多个非URL子字符串?(在这种情况下,您需要这些子字符串的数组吗?),我不知道该怎么解决it@CertainPerformance我明白你的意思了,我也添加了一个替换变量。不过,这也匹配了前导空格,这可能并不可取。Group1捕获不包含空格的文本。我可以对整个匹配使用正向查找,以不包含任何额外空格,但是很多旧的工具/浏览器不支持ECMAScript 2018,因此它们都不能工作,所以必须使用分组捕获。该组不包含任何额外的前导/尾随空格,正如我在演示中看到的那样,这应该适用于OP.@PushpeshKumarRajwanshi+1。另一个选项是使用
urlRegexp
s.replace(/(http | https | ftp | ftps)\/\/[a-zA-Z0-9\-\]+.[[a-zA-Z]{2,3}(\/\s*)/g.))