在第一个字符匹配时停止? [复制]
Posted
技术标签:
【中文标题】在第一个字符匹配时停止? [复制]【英文标题】:Stop at first character match? [duplicate] 【发布时间】:2014-11-15 11:21:08 【问题描述】:我想在一个大的 html 文本中获取某个 html 节点,但是我的正则表达式中的某些内容是错误的。
我想获取所有如下所示的网址:
<a href="ftp://mysite.com"> some stuff </a>
我正在努力:
/<a href="ftp:(.+)">/
但有时它会起作用,但有时它会抓住一切,直到下一次关闭>
。
有没有办法重写这个正则表达式,让它在第一个 >
处停止?
【问题讨论】:
+
天生贪婪。您需要通过在+
之后添加?
限定符来使其不贪婪。所以你的正则表达式是<a href="ftp:(.+?)">
如果您希望它匹配直到"
的所有内容,请使用[^"]*
,而不是.+
。
【参考方案1】:
+
是一个 greedy 运算符,这意味着它尽可能匹配并且仍然允许正则表达式的其余部分匹配。为此,我建议使用否定类,表示任何字符,除了:"
“一次或多次”次。
/<a href="ftp:([^"]+)">/
Live Demo
【讨论】:
【参考方案2】:让你的正则表达式不贪婪:
/<a href="ftp:(.+?)">/
// here __^
或:
/<a href="ftp:([^>"]+)">/
但最好使用解析器。
【讨论】:
【参考方案3】:*
、+
是灰色的(尽可能匹配)。通过在它们后面附加?
,你可以做到非贪婪。
/<a href="ftp:(.+?)">/
或者您可以使用否定字符类 ([^...]
) 指定排除 "
:
/<a href="ftp:([^"]+)">/
BTW, it's not a good idea to use regular expression to parse HTML.
【讨论】:
以上是关于在第一个字符匹配时停止? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式 - 在第一个和第三个字符之间插入一个特殊字符 (~),并且仅当存在完全匹配时
sed命令,搜索某个字符串,结果有多个匹配行,在第一个匹配行的前面添加一行内容