正则表达式匹配定义字符串中间的任意数量的字符

时间:2012-04-25 12:58:40

标签: regex

我正在尝试使用正则表达式来匹配特定模式。

如果样本测试字符串如下:

/wp-content/themes/sometheme/style.css

正则表达式应该:

  1. 从头开始,确切地匹配/wp-content/themes/,并且也应该从最后确切地匹配/style.css
  2. NOT MATCH,当余数(第1项中的开头和结尾字符串之间)为rwsarbor
  3. MATCH,剩下的是什么但是mythemename
  4. 对于中间的动态部分,它应匹配任意数量的字符和任何字符类型(不仅仅是a-z,0-9等)
  5. 例如,它不匹配:

    /wp-content/themes/mythemename/style.css
    

    它应匹配

    /wp-content/themes/jfdskjh-ekhb234_sf/style.css
    /wp-content/themes/another_theme/style.css
    /wp-content/themes/any_other-theme/style.css
    /wp-content/themes/!@#$%^&*()_+{}|:"?</style.css
    

    这个在复杂性方面有点偏离了我的联盟,所以我期待社区的帮助。

3 个答案:

答案 0 :(得分:3)

试试这个:

^/wp-content/themes/(?!mythemename).*/style.css$

演示: http://regexr.com?30ote


提示:使用Negative look-ahead assertion

答案 1 :(得分:1)

只需要制作两个正则表达式,一个匹配,一个不匹配(这里用grep做):

 echo /wp-content/themes/sametheme/style.css | egrep "^/wp-content/themes/.*/style.css$" | egrep -v "(simetheme|sametheme)" 

而不是rwsarbor和mytheme,我选择了一些更好的可测试的东西。

较短的演示本来没问题,顺便说一下:/ start / middle / end

答案 2 :(得分:0)

Vim正则表达式:

^\/wp-content\/themes\/\(rwsarbor\|mythemename\)\@!.\{-}\/style\.css$

重点:

\(__\|__\) - match one or the other pattern
\@! - match if the preceeding atom didn't match
.\{-\} - Like .* but non-greedy, otherwise style.css would get sucked up here

语法和修饰符取决于您将要使用的特定正则表达式引擎。