Несколько строк имеют специальные символы в регулярном выражении - PullRequest
3 голосов
/ 21 июня 2019

Я новичок в регулярных выражениях, у меня есть требование найти "/./" или "/../" в строке.Моя программа выглядит следующим образом:

String Path1 = "https://18.56.199.56/Directory1/././Directory2/filename.txt";
String Path2 = https://18.56.199.56/Directory1/../../Directory2/filename.txt";
String Path3 = "https://18.56.199.56/Directory1/Directory2/filename.txt";

Regex nameRegex = new Regex(@"[/./]+[/../]");
bool b = nameRegex.IsMatch(OrginalURL);

Этот код дает значение true для Path3 (также не имеет строк "." Или "..").

Кажется, выражение "Regex nameRegex = new Regex (@" [/./]+[/../] ");"неправда.Пожалуйста, исправьте это выражение.

Соответствие регулярному выражению должно быть успешным для Path1 или Path2, а не Path3.

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Ваше регулярное выражение [/./]+[/../] (= [/.]+[/.]) соответствует 1+ / или . символам, за которыми следует / или .. Таким образом, он может соответствовать ....../, ///////////// и, конечно, // в части протокола.

Если вам не нужно использовать регулярное выражение, вы можете просто использовать .Contains:

if (s.Contains("/../") || s.Contains("/./"))  { ... }

См. Это C # демо .

Вы также можете использовать следующее регулярное выражение:

bool b = Regex.IsMatch(OrginalURL, @"/\.{1,2}/");

См. эту демонстрацию регулярных выражений и график регулярных выражений :

enter image description here

Детали

  • / - / char
  • \.{1,2} - 1 или 2 точки
  • / - / char.
0 голосов
/ 21 июня 2019

Хотя это не лучший способ выполнить эту задачу, может сработать выражение, подобное:

\/\.{1,2}(?=\/)

.

Демо

Escapeing только для демонстрационных целей, вы можете удалить их.

Тест

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"\/\.{1,2}(?=\/)";
        string input = @"https://18.56.199.56/Directory1/./Directory2/filename.txt
https://18.56.199.56/Directory1/././Directory2/filename.txt
https://18.56.199.56/Directory1/../../../Directory2/filename.txt
https://18.56.199.56/Directory1/./../.../Directory2/filename.txt
https://18.56.199.56/Directory1/Directory2/filename.txt";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...