【问题标题】:Javascript Regex: match text after patternJavascript Regex:匹配模式后的文本
【发布时间】:2014-10-14 04:39:22
【问题描述】:

我有一种形式的文本,其中有散布有 url 的文本段落。 我想解析从 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 与我正在尝试做的事情相关,只是将 url 作为文本放置在锚元素中。

我已成功将 url 与

匹配
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 包装在 /(?&lt;=my url pattern here).+/ 中,但收到一条错误消息,指出存在无效组,这会导致 RE 无效。

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

不允许可变长度的lookbehinds

这是我想要做的吗?

由于我已经匹配了 url,我觉得我可以轻松地进行一些子字符串数学运算来获得所需的结果。

我只是用它来尝试了解更多关于正则表达式的信息。

谢谢

【问题讨论】:

  • 仅供参考,不仅在大多数正则表达式风格中不允许使用可变长度的lookbehinds (.NET 是这里规则的例外),JavaScript 不支持lookbehinds 完全没有
  • 关于您的正则表达式的注释。它要求在域之后有非空格。 ([^ ])+。如果有site.XX 这样的东西,它不会匹配。您可以将其更改为 ([^ ])*,我认为这并不重要。

标签: javascript regex


【解决方案1】:

只需添加另一个捕获组以在最后捕获所有内容并使您的内部组不捕获。比如:

    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] 中,url 部分将在[1] 中,其余文本在[2] 中。这就是我们使用非捕获组的原因,因为否则您将拥有一堆可能有用也可能没有用的其他捕获。

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多