2010-11-30 2 views
0

Я пытаюсь разобрать строку типа:.Net C# регулярное выражение для разбора метод/свойство цепочки вызовов

.A.B[C].D(E).F("(G)/{H})", "1" == "1").I.J[K]

где А, В, I, J являются имена свойств, D, F названия метода, E, "(G)/{H})", "1" == "1" и значения индекса C и K. , Параметры могут содержать любые символы, и строка может содержать любое количество свойств и/или методов.

Я ищу регулярное выражение, которое будет выполнять эту работу. До сих пор я придумал

(?<=\.)(?< PropertyOrMethodName>\w+)((\\[(?< Index>\w+)\\])|((?< Open>\\()(?< Parameters>.+)(?<-Open>\\))(?(Open)(?!))))?

, но это не очень хорошо, например, для вышеприведенного образца захватываются D (E) .F ("(G)/{H})", "1" == "1") вместе.

+1

Это, мне, по крайней мере, звучит * немного * немного похоже на попытку разобрать HTML с регулярным выражением - только о выполнимо в ** некоторые ** случаи, но если вы хотите что-то надежное, которое справляется с краевыми случаями, вам может понадобиться написать анализатор на основе состояний. – 2010-11-30 05:54:34

ответ

1

Я не думаю, что вы получите хорошие результаты вообще с регулярным выражением, если у вас нет строго ограниченного образца C#, который вы хотите проанализировать, - и если это так, вам лучше дать образец возможные линии в вашем вопросе.

Например:

public void SomeMethod(int x) 
    { 
    foo.bar.baz(x, y => qux(y))[(x - 1)] = e.value; 
    } 

Даже если вы придумали регулярное выражение, которое может успешно разобрать эти и другие сложные случаи (удач) - это Foo пространство имен, бар класса, и БАЗ статического метода ? или foo поле текущего типа, bar свойство на этом и baz метод экземпляра? Без парсера вы действительно не понимаете, что означает каждый элемент.

Я хотел бы предложить, глядя на синтаксический анализатор - попробуйте начать с этого SO вопрос: Parser for C#

Смежные вопросы