регулярное выражение для захвата всех путей к файлам, не содержащих ссылки на каталог - PullRequest
3 голосов
/ 08 декабря 2010

Я пытаюсь написать регулярное выражение для сопоставления путей к файлам со следующими характеристиками:

  1. не содержит /./ или /../
  2. должно быть как минимум вложеннымодин подкаталог глубоко внутри /tmp/media
  3. должен оканчиваться на .log

Здесь - это то, что у меня есть:

\/tmp\/media\/(?!.*\.?\.\/)+(?:.*\.log)

Вот мои желаемые результаты (если строка не совпадает, я цитирую требование, которое не выполняется):

/tmp/media/log.log             //NO-MATCH (2)
/tmp/media/test/log.log        //MATCH
/tmp/media/../log.log          //NO-MATCH (1)
/tmp/media/./log.log           //NO-MATCH (1)
/tmp/media/test/../log.log     //NO-MATCH (1)
/tmp/media/../test/log.log     //NO-MATCH (1)
/tmp/media/.t/log.log          //MATCH
/tmp/media/.../log.log         //MATCH
/tmp/log.log                   //NO-MATCH (2)
/tmp/media/test/log.notlog     //NO-MATCH (3)
/tmp/media/test/./log.log      //NO-MATCH (1)

Я прочитал этот вопрос и успешно реализовал некоторыеответа, но /tmp/media/log.log все еще совпадает, когда я этого не хочу.Я подозреваю, что это потому, что пустая строка между /media/ и log.log как-то удовлетворяет (?!.*\.?\.\/).

Может кто-нибудь объяснить, что я делаю неправильно, и помочь мне исправить свое выражение?

Ответы [ 3 ]

1 голос
/ 08 декабря 2010

Вы можете попробовать это:

^(?![^.]*\/\.\.?\/)\/tmp\/media\/(?:[^\/]+)*\/\w+\.log$

Рубулярное звено

1 голос
/ 08 декабря 2010

Вы должны действительно сначала канонизировать свои пути.Это позволит избежать попыток заблокировать каталоги . и .. в самом регулярном выражении.Как только вы это сделаете, регулярное выражение станет:

\/tmp\/media\/[^\/]+\/.*\.log

Не зная, на каком языке вы программируете, я не могу предложить механизм канонизации пути.

1 голос
/ 08 декабря 2010

Нужно ли быть регулярным выражением? Как указано в ссылке, которую вы предоставили, вы можете использовать readlink. Кроме того, было бы проще просто проверить /./ и /../ перед выполнением сопоставления с регулярным выражением для других ограничений - это сделает ваш код чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...