如何仅提取与正则表达式的第一个匹配项?
How to extract only first match with regexp?
以下是字符串示例:
<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}).+(\")
您可以试试这个正则表达式:
(?<=>)([0-9]{8}.+)(?=<)
\b\d{8}[^" ]*\.jpg(?![^"]*"(?:[^"]*"[^"]*")*[^"]*$)
尝试 this.See 演示。
我知道您不想使用 html 解析器,但我想证明这对于将来发现此问题的人来说是多么简单。
regex 有点像有时对 html 有效,但有很多事情不适用:它会留下 html 个实体(例如 &
)未解码和提取正确的标签可能很难。 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 文档的其余部分。
以下是字符串示例:
<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}).+(\")
您可以试试这个正则表达式:
(?<=>)([0-9]{8}.+)(?=<)
\b\d{8}[^" ]*\.jpg(?![^"]*"(?:[^"]*"[^"]*")*[^"]*$)
尝试 this.See 演示。
我知道您不想使用 html 解析器,但我想证明这对于将来发现此问题的人来说是多么简单。
regex 有点像有时对 html 有效,但有很多事情不适用:它会留下 html 个实体(例如 &
)未解码和提取正确的标签可能很难。 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 文档的其余部分。