She*_*aff 2 regex bash word-boundary
我想在 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"where$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:]])
Run Code Online (Sandbox Code Playgroud)
请注意,我去掉了 initial^.*和ending .*$,因为在进行其他未锚定的匹配时,这些构造是自否定的;the.*使得^紧接在它之前的 变得毫无意义,同样.*在 final 之前的$。
现在,如果你想要一个完全等同于\bwhen 放在序列开头的单词字符之前,那么我们会得到更像:
(^|[^a-zA-Z0-9_])
Run Code Online (Sandbox Code Playgroud)
...而且,同样,当紧跟在序列末尾的单词字符之后时:
($|[^a-zA-Z0-9_])
Run Code Online (Sandbox Code Playgroud)
这两种情况都有些退化——在其他情况下,\b在 ERE中模拟 的行为可能会更复杂——但它们是您的问题出现的唯一情况。
请注意, 的某些实现\b会更好地支持非 ASCII 字符集,因此可以用[^[:alnum:]_]而不是更好地描述[^a-zA-Z0-9_],但是这里没有明确定义您来自哪个实现或与之比较。
| 归档时间: |
|
| 查看次数: |
4733 次 |
| 最近记录: |