如何只用正则表达式提取第一个匹配?

时间:2015-01-14 12:48:24

标签: regex d

这是字符串示例:

<option value="20150110.1932.mtsat_2.visir.bckgr.NW_Pacific_Overview.DAYNGT.jpg">20150110.1932.mtsat_2.visir.bckgr.NW_Pacific_Overview.DAYNGT.jpg</option>
<option value="20150110.1901.mtsat_2.visir.bckgr.NW_Pacific_Overview.NGT.jpg">20150110.1901.mtsat_2.visir.bckgr.NW_Pacific_Overview.NGT.jpg</option>

预计会出现:

20150110.1932.mtsat_2.visir.bckgr.NW_Pacific_Overview.DAYNGT.jpg
20150110.1901.mtsat_2.visir.bckgr.NW_Pacific_Overview.NGT.jpg

我只需要从不带引号符号的字符串中提取文件名的第一个匹配项。我该怎么办?

模式是前6位数字,以jpg结尾

我正在编程D.

我有很多变种。而且所有这些都是残废的。其中之一:

(="[0-9]{8}).+(\")

3 个答案:

答案 0 :(得分:4)

我知道你不想使用html解析器,但是我想展示一下今后发现这个问题的人有多简单。

regex kinda sorta有时适用于html,但有很多事情它没有:它会留下html实体(例如&amp;)未解码并提取正确的标签可以是硬。 HTML解析器使其变得简单和正确(并且IMO更具可读性):

我的dom.d在html上做得不错,所以我将展示如何使用它。

从我的github获取dom.d:

https://github.com/adamdruppe/arsd/blob/master/dom.d

(如果您正在从随机的非UTF-8网站解析标签汤,那么characterencodings.d:https://github.com/adamdruppe/arsd/blob/master/characterencodings.d

然后你可以这样做:

import arsd.dom;
import std.stdio;

void main() {
    auto document = new Document("your html string here");
    foreach(option; document.querySelectorAll("option"))
         writeln(option.value); // or option.innerText
}

dmd yourfile.d dom.d汇编。 (如果你还需要处理非utf-8,请在命令行中添加characterencodings.d)

querySelectorAll与CSS选择器类似,类似于Javascript和jQuery中的相同函数,因此您也可以放入上下文以从html文档的其余部分中提取选项标记。

答案 1 :(得分:2)

你可以试试这个正则表达式:

(?<=>)([0-9]{8}.+)(?=<)

Online demo

答案 2 :(得分:2)

\b\d{8}[^" ]*\.jpg(?![^"]*"(?:[^"]*"[^"]*")*[^"]*$)

试试这个。看看演示。

https://regex101.com/r/fA6wE2/20