【问题标题】:How to use the Regular Express of the end pattern in the next pattern not the entire string?如何在下一个模式而不是整个字符串中使用结束模式的正则表达式?
【发布时间】:2017-09-18 20:28:58
【问题描述】:

我正在尝试使用正则表达式在网站中查找类别。 我输入了(?<=class="category-section" data-id=")(.*)(?=" id="nav) 但它会将整个字符串返回给我,我看到它从data-id=" 之后的第一个模式开始,直到结束模式有" id="nav

例如:

<div class="category-section" data-id="Motors" id="nav-1">
<div class="category-section" data-id="Fashion" id="nav-2">

我希望在比赛中获得 Motors and Fashion 但它会回来

 Motors" id="nav-1"> <div class="category-section" data-id="Fashion

我不明白....

【问题讨论】:

  • data-id=(['"]?)(.*?)\1 - 第二个捕获组包含您想要的内容,尽管您确实应该为此使用 XML 解析器。
  • 强制:**不要使用正则表达式来解析 HTML! **
  • 如果你在 Notepad++ 中做某事,你应该使用这个(?&lt;=data-id=")(.*)(?=")
  • @TomLord 请向 OP 解释 为什么 用正则表达式解析 HTML 是一条悲伤之路。只是说“不要那样做”并没有多大帮助。
  • 您尝试用哪种语言实现此功能?

标签: regex html-parsing


【解决方案1】:

试试这个:

data-id=".*?"

它会返回两个匹配,然后对应data-id="Motors"data-id="Fashion"

所以,你可以替换 data-id=" 来获得你想要的值,里面的属性。

编辑 1:

通过使用简单的js函数,可以检索到这个值:

<div class="category-section" data-id="Motors" id="nav-1">Content1</div>
<div class="category-section" data-id="Fashion" id="nav-2">Content2</div>

<script>
    (function() {
        var data = document.getElementsByClassName('category-section');
        for (var i = 0; i < data.length; i++) {
            console.log(data.item(i).getAttribute('data-id'));
        }
    })();
</script>

输出:

Motors
Fashion

【讨论】:

  • 它可以工作@Abe,但我的副总裁希望我使用纯 RE 来获取目标,而不是使用函数来切断它>_
  • 您使用的是什么语言或资源?是纯JS吗?我们可以构建一个简单的函数来实现它。
  • 我做 C#,但这次只做纯 RE
猜你喜欢
  • 2022-10-01
  • 2015-05-02
  • 1970-01-01
  • 2023-01-31
  • 2015-06-12
  • 1970-01-01
  • 2018-11-09
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多