c # Регулярное выражение - PullRequest
       5

c # Регулярное выражение

1 голос
/ 30 августа 2010

Я пытаюсь отфильтровать некоторый текст на основе регулярных выражений, таких как телефон * означает, что мне нужен текст "Телефонная будка", "Телефонный куб" и т. Д.

Но когда я даю кабину *, она также выбирает Телефонную будку,Не стоит ли выбирать это обряд?Вот код,

string[] names = { "phone booth", "hall way", "parking lot", "front door", "hotel lobby" };

        string input = "booth.*, door.*";
        string[] patterns = input.Split(new char[] { ',' });
        List<string> filtered = new List<string>();

        foreach (string pattern in patterns)
        {
            Regex ex = null;
            try
            {
                ex = new Regex(pattern.Trim());
            }
            catch { }
            if (ex == null) continue;

            foreach (string name in names)
            {
                if (ex.IsMatch(name) && !filtered.Contains(name)) filtered.Add(name);
            }
        }

        foreach (string filteredName in filtered)
        {
            MessageBox.Show(filteredName);
        }

Он отображает «Телефонная будка» и «Передняя дверь».Но по моим критериям это ничего не должно показывать, потому что никакая строка не начинается с будки или двери.

Есть ли проблемы в моем регулярном выражении?

Ответы [ 5 ]

5 голосов
/ 30 августа 2010

Если вы хотите найти совпадение в начале строки, начинающейся с ^

Так, например, если вы хотите, чтобы совпадение начиналось с телефона, а затем содержало символы, вы могли бы сделать следующее

^phone.*

Символ ^ привязывает совпадение к началу строки.

3 голосов
/ 30 августа 2010

Проблема в том, что вы не указываете, что строка должна начинаться с booth или door, просто строка должна содержать booth или doorза которым следует строка нулевой длины или больше.

Если, однако, вы измените свое регулярное выражение на ^booth.* и ^door.*, все должно работать.

Символ каретки (^), который следует отметить, означает «начало строки / строки» (в зависимости от того, находится ли ваше регулярное выражение в многострочном режиме - т.е., если . будет соответствовать символам новой строки.)

1 голос
/ 30 августа 2010

Вам нужно указать начало строки в своем регулярном выражении, если вы не хотите, чтобы "телефонная будка" соответствовала.

Пример:

^booth.*

будет соответствовать "будке", но не "телефонной будке".

booth.*

Будет соответствовать любой строке, в которой есть "booth".

1 голос
/ 30 августа 2010

Да, вы должны префиксировать ваши шаблоны с помощью «^», например так:

string input = "^booth.*, ^door.*";

Это скажет C #, что вы хотите только то, что начинается с «будка» или «дверь».Больше информации здесь: http://oreilly.com/windows/archive/csharp-regular-expressions.html

0 голосов
/ 30 августа 2010

Ваш Regex не указывает, что расположение совпадающей строки в шаблоне ограничено местоположением. Если вы хотите убедиться, что вы соответствуете только начальным подстрокам, вы должны указать «^» в качестве первой части шаблона.

Подробнее см. http://msdn.microsoft.com/en-us/library/az24scfc.aspx.

...