\b
是 PCRE 扩展;它在 POSIX ERE(扩展正则表达式)中不可用,这是=~
bash 中的运算符[[ ]]
将遵循的最小可能的语法集。(单个操作系统可能具有扩展此语法的 libc;在这种情况下,这些扩展将在此类操作系统上可用,但并非在支持 bash 的所有平台上可用)。
作为基线,该\b
扩展实际上并没有太多的表达能力——您可以编写任何 PCRE 将其用作等效的 ERE。不过,更好的是退后一步,质疑潜在的假设:当你说“单词边界”时,你的真正意思是什么?如果您关心的是,如果它以空格或字符串的开头或结尾开始和结束,那么您根本不需要\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^.*
和 ending .*$
,因为在进行其他未锚定的匹配时,这些构造是自否定的;the.*
使得^
紧接在它之前的 the 没有意义,同样地,.*
就在 final 之前$
。
现在,如果你想要一个完全等价于\b
when 放置在序列开头的单词字符之前,那么我们会得到更像:
(^|[^a-zA-Z0-9_])
...同样,当紧跟在序列末尾的单词字符之后时:
($|[^a-zA-Z0-9_])
这两种情况都有些退化——在其他情况下,模仿\b
ERE 中的行为可能会更复杂——但它们是您的问题出现的唯一情况。
请注意,某些实现\b
对非 ASCII 字符集有更好的支持,因此用[^[:alnum:]_]
而不是更好地描述[^a-zA-Z0-9_]
,但这里没有明确定义您来自哪个实现或与之比较。