我想在bash中匹配以下表达式:
^.*(\b((720p)|(1080p)|(((br)|(hd)|(bd)|(web)|(dvd))rip)|((x|h)264)|(DVDscr)|(xvid)|(hdtv)|(ac3)|(s[0-9]{2}e[0-9]{2})|(avi)|(mp4)|(mkv)|(eztv)|(YIFY))\b).*$
真的所有我想知道的是测试字符串的话一个是在这个正则表达式描述的词之一(720p
,1080p
,brrip
,...)。边界一词似乎有问题。
我使用的测试是[[ $name =~ $re ]] && echo "yes"
哪里$name
是任何字符串,$re
是我的正则表达式。
我想念什么?
\b
是PCRE扩展;它在POSIX ERE(扩展的正则表达式)中不可用,这是=~
bash运算符支持的最小语法集[[ ]]
。(单个操作系统可能具有扩展此语法的libc;在这种情况下,这些扩展将在此类操作系统上可用,但并非在支持bash的所有平台上都可用)。
作为基准,\b
扩展实际上并没有很大的表达能力-您可以编写将其用作等效ERE的任何PCRE。不过,更好的是退后一步并质疑基本假设:当您说“单词边界”时,您真正的意思是什么?如果您所关心的只是如果它以空格或字符串的开头或结尾开始和结束,那么您根本不需要\b
运算符:
(^|[[:space:]])((720p)|(1080p)|(((br)|(hd)|(bd)|(web)|(dvd))rip)|((x|h)264)|(DVDscr)|(xvid)|(hdtv)|(ac3)|(s[0-9]{2}e[0-9]{2})|(avi)|(mp4)|(mkv)|(eztv)|(YIFY))($|[[:space:]])
请注意,我取出了initial^.*
和end .*$
,因为在进行其他未匹配的匹配时,这些构造是自负的。在.*
使^
立即之前没有意义,同样,.*
只是之前的最后$
。
现在,如果你想要一个确切相当于\b
当在序列的开始单词字符之前放置,然后我们得到更多的东西一样:
(^|[^a-zA-Z0-9_])
...并且同样地,当在序列末尾紧接单词字符之后:
($|[^a-zA-Z0-9_])
这两种情况都是简陋的情况-在其他情况下,模拟\b
ERE中的行为可能会更加复杂-但它们是您的问题似乎只出现的情况。
请注意,的某些实现\b
会更好地支持非ASCII字符集,因此使用[^[:alnum:]_]
而不是可以更好地进行描述[^a-zA-Z0-9_]
,但是此处并没有明确定义您来自哪个实现或与其进行比较。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句