regex - 正则表达式匹配澳大利亚分类委员会使用的评级
问题描述
我之前试图通过抓取 HTML 来制作一个列表,但我意识到同样的模式发生了两次,我希望首先出现的数据紧随其后的是相同的数据,但其中一个澳大利亚分类字母作为字符串。
一个人将如何只匹配分类评级,以及如何在跳过不想要的模式的同时匹配所需的模式?
示例:
<a href="url" title="Name">Name</a>
和一个类似的,除了<a href="url" title="Name">Rating</a>
. 旨在匹配Name
第一个示例的全部或全部。
目前的尝试包括:
- PCRE -
<a href=\".*\" title=\"(.*)\">\g1<\/a>
没用 <a href=\".*\" title=\".*\">.*<\/a>
匹配他们所有。这个最终匹配了所需的模式以及包括评级在内的模式。<a href=\".*\" title=\".*\">[(?!(MA15\+)(PG)(G)(M)(R)]+.*<\/a>
负前瞻仅匹配正确的开头,并希望避免匹配评级。
注:澳大利亚分级委员会有多个等级包括:CTC、G、PG、M、MA15+、R18+和X18+;全部(几乎)仅以大写形式使用。
注意(再次):正则表达式的类型并不重要。
解决方案
关于您尝试的最后一个模式:
如果你把这些值放在一起,(MA15\+)(PG)(G)(M)(R)
这意味着它会匹配一个字符串MA15+PGGMR
如果将它放在方括号之间,就像[(?!(MA15\+)(PG)(G)(M)(R)]
它是与列出的字符之一匹配的字符类一样。
您可以使用负前瞻列出备选方案,并使用 a|
表示交替。
<a href="[^"]*" title="(?!(?:CTC|P?G|M(?:A15\+)?|[RX]18\+)")([^"]*)">\g1</a>
解释
<a href="[^"]*" title="
字符串的开头,使用否定字符类[^
匹配任何字符,除了"
(?!
负前瞻,资产直接在右边不是(?:CTC|P?G|M(?:A15\+)?|[RX]18\+)"
匹配选项之一,然后是结束"
)
关闭前瞻([^"]*)">
捕获组 1,匹配 0+ 任何字符,除了'
后跟匹配 a>
\g1
匹配与第 1 组匹配的相同文本</a>
匹配字符串的结尾部分
推荐阅读
- amazon-web-services - 正文被 CloudFront 拒绝的 AWS GET 请求
- ms-access - 从安全网站自动下载的问题
- gremlin - gremlin step .dedup('from' , 'to'') 如何工作?
- regex - 在 Angular/TypeScript 中使用 RegExp 检查同一电子邮件时,输入字段上的模式属性返回不同的结果?
- python - Sounddevice ValueError:无法将输入数组从形状 (2048) 广播到形状 (2048,1)
- c++ - 提升动态链接
- sql - 在NiFi的QueryDatabaseTable中执行多个Select *
- video - 为什么 MP4 mdat atom 不以 H.264 NALU 起始码开头?
- android - 无法从 Volley 的响应中接收数据(异步调用)
- rust - 我什么时候应该使用usize vs i32,f32?