Javascript Regex:匹配模式后的文本

时间:2014-10-13 20:26:53

标签: javascript regex

我有一个表单的文本,其中有段落的文本与点缀的网址。 我想解析从URL创建html链接的字符串,并使用以下文本作为描述性链接文本,即

possibly some text here http://www.somewebsite.com/some/path/somepage.html descriptive text which may or may not be present

进入

<a href="http://www.somewebsite.com/some/path/somepage.html">descriptive text which may or may not be present</a>

这篇SO文章JS: Find URLs in Text, Make Links与我正在尝试的内容相关,只是将网址放在锚元素中作为文本。

我已成功将网址与

匹配
var urlRE= new RegExp("([a-zA-Z0-9]+://)?([a-zA-Z0-9_]+:[a-zA-Z0-9_]+@)?([a-zA-Z0-9.-]+\\.[A-Za-z]{2,4})(:[0-9]+)?([^ ])+");

但不确定之后如何进行比赛。

我发现这篇文章Regex - Matching text AFTER certain characters似乎适用。我试图将我的RE包装在/(?<=my url pattern here).+/中但是得到一个错误,指出存在一个无效的组,这会导致RE无效。

在那篇文章中,J-Law提到了

  

不允许使用可变长度的后视镜

这是我正在尝试做的吗?

因为我已经匹配了网址,所以我觉得我可以很容易地做一些子字符串数学来获得所需的结果。

我只是试图了解有关正则表达式的更多信息。

由于

1 个答案:

答案 0 :(得分:4)

只需添加另一个捕获组即可捕获最后的所有内容并使内部组无法捕获。类似的东西:

    var urlRE= new RegExp("((?:[a-zA-Z0-9]+://)?(?:[a-zA-Z0-9_]+:[a-zA-Z0-9_]+@)?(?:[a-zA-Z0-9.-]+\\.[A-Za-z]{2,4})(?::[0-9]+)?(?:[^ ])+)(.*)$");

    var s = "possibly some text here http://www.somewebsite.com/some/path/somepage.html descriptive text which may or may not be present"
    
    var match = urlRE.exec(s);
    alert(match[0] + "\n\n" + match[1] + "\n\n" + match[2]);

    // Returns: 
    // ["http://www.somewebsite.com/some/path/somepage.html descriptive text which may or may not be present", 
    // "http://www.somewebsite.com/some/path/somepage.html", 
    // " descriptive text which may or may not be present"]

我将整个正则表达式包含在方括号()中以形成第一个捕获组,在其中我使用?:使所有现有组无法捕获,您不一定需要这样做(使它们不捕获),但它确实简化了输出。然后我又添加了一个组(.*)来捕获其他所有内容,直到字符串$结束。

.exec如果您匹配,则您的匹配将位于[0],网址部分位于[1],其余文字位于[2]。这就是我们使用非捕获组的原因,因为否则你会有许多其他捕获可能会或可能没用。