C # Regex.Split со многими строковыми образцами более 20 - PullRequest
0 голосов
/ 16 января 2012

Привет! Я пытался отфильтровать большой текстовый файл с помощью Regex.Split с более чем 20 строковыми шаблонами, которые мне нужно использовать, но результат неверный и так много пустых строк.

ниже приведен мой код

string[] tmp = Regex.Split(originalString, @"(LINE|3DFACE|3DSOLID|ARC|ATTDEF|ATTRIB|BODY|CIRCLE|DIMENSION|ELLIPSE|HATCH|HELIX|IMAGE|INSERT|LEADER|LIGHT||LWPOLYLINE|MLINE|MLEADER|MLEADERSTYLE|MTEXT|OLEFRAME|OLE2FRAME|POINT|POLYLINE|RAY|REGION|SECTION|SEQEND|SHAPE|SOLID|SPLINE|SUN|SURFACE|TABLE|TEXT|TOLERANCE|TRACE|UNDERLAY|VERTEX|VIEWPORT|WIPEOUT|XLINE)");

, если я использую только около 5 из них, тогда результат может быть выполнен именно так, как мне нужно, есть ли ограничение для regex.split для строковых шаблонов?

РЕДАКТИРОВАТЬ 1

СПАСИБО @ MRAB

вот код для фактического запуска работающего и правильного вывода

        string fileName = textBox1.Text;
        var stopwatch = new System.Diagnostics.Stopwatch();
        stopwatch.Start();
        TextReader sr = new StreamReader(fileName);
        string originalString = sr.ReadToEnd();
        sr.Close();
        string[] tmp = Regex.Split(originalString, @"(3DFACE|3DSOLID|ACAD_PROXY_ENTITIY|ARC|ATTDEF|ATTRIB|BODY|CIRCLE|DIMENSION|ELLIPSE|HATCH|HELIX|IMAGE|INSERT|LEADER|LIGHT|LWPOLYLINE|MLINE|MLEADERSTYLE|MLEADER|MTEXT|OLEFRAME|OLE2FRAME|POINT|POLYLINE|RAY|REGION|SEQEND|SHAPE|SOLID|SPLINE|SUN|SURFACE|TABLE|TEXT|TOLERANCE|TRACE|UNDERLAY|VERTEX|VIEWPORT|WIPEOUT|XLINE|LINE)");
        List<string> result = new List<string>();


        for (var i = 1; i < tmp.Count() - 1; i += 2)
        {

            result.Add(tmp[i] + tmp[i + 1]);
        }

Ответы [ 2 ]

0 голосов
/ 16 января 2012

Как сказал @IanNorton, в зависимости от ваших исходных данных, вы можете рассмотреть возможность использования строкового токенизатора вместо RegEx / Split.У тех, кто разрабатывает Lucene.Net , есть хороший пример, который вы можете использовать / учиться.

0 голосов
/ 16 января 2012

Вы используете статический метод Split класса Regex.Существует также метод Split для Regex экземпляров, например:

new Regex(@"(LINE|3DFACE|3DSOLID)").Split(originalString, 5, 0);

Ваш код содержит это в регулярном выражении:

"LIGHT||LWPOLYLINE"

, что для меня выглядит ошибкой.

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

"MLEADER|MLEADERSTYLE"

и такая строка:

"MLEADERSTYLE"

, оно будет соответствовать "MLEADER", потому чточто происходит раньше в регулярном выражении.Если короткий литерал встречается как префикс более длинного литерала, поместите более длинный ранее.

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