Как улучшить RegEx (\ bL \ s * \ d {6} \ s * \ d {7} \ b) - PullRequest
0 голосов
/ 02 мая 2009

Это продолжение предыдущего вопроса ( Помощь в уточнении RegEx ("\ b \ d {6} ([] {1,15}) \ d {7} \ b") ). Цель состоит в том, чтобы получить Lat / Lon из файла. Это обозначается буквой L или шаблоном 6d / 7d. Я неправильно заявил, что между началом лат (305455) и лоном (1025446) не может быть альфа. Когда я реализовал предложенный Regex, все было замечательно, пока я не нашел этот файл. Обратите внимание, что '6770G37 содержит альфу и нарушил шаблон или что он имел 6 цифр и перезапустил шаблон. Не достаточно хорошо с Reg Ex, чтобы понять это. Вот три разных шаблона, которые мне нужно найти. Спасибо!

I  FST E  030                                                       66686500    
    L  305455                                              '6770G37 66686501    
       1025446                                             '6770G37 66686502    
    O  ZCA/999                                                      66686503    
    H  05                                                           66686504    

I  ARA                                    '* ACADIANA  AIRPORT         29865996    
            L    300216                               '2425     29865997    
                 0915302                              '2425     29865998    
            S    MSY                                            29865999   

I JENNA078033 ' ZFW L 322823 0923754 ' ZFW

(переведено из удаленного ответа)

Это продолжение ответа Гишу, но ему не удалось отформатировать область комментариев. Regex, который он предложил L\s*(\d{6})\s*(?:'.*\n)?\s*(\d{7}), работал для нескольких возможностей, но потерпел неудачу в этом паттерне, используя движок .Net с включенной многострочной опцией.

Цель состоит в том, чтобы захватить лат 322441 и лона 0994055.

Возвращенное совпадение:

L  322441                                             '1325     66685780 

Пример данных .....

I  ABI E   018                                                          66685779    
        L  322441                                             '1325     66685780    
           0994055                                            '1325     66685781    
        O  ZCF/999                                                      66685782    
        H  05                                                           66685783    

Еще раз спасибо, ребята!


Это продолжение ответа Гишу, но ему не удалось отформатировать область комментариев. Regex, который он предложил L\s*(\d{6})\s*(?:'.*\n)?\s*(\d{7}), работал для нескольких возможностей, но потерпел неудачу в этом паттерне, используя движок .Net с включенной опцией multi-line

Цель состоит в том, чтобы захватить Lat 322441 и Lon 0994055.

Возвращенное совпадение:

L  322441                                             '1325     66685780 

Пример данных .....

I  ABI E   018                                                          66685779    
        L  322441                                             '1325     66685780    
           0994055                                            '1325     66685781    
        O  ZCF/999                                                      66685782    
        H  05                                                           66685783    

Еще раз спасибо, ребята!

Ответы [ 2 ]

1 голос
/ 02 мая 2009

Посмотрите, работает ли этот .. L\s*(\d{6})\s*(?:'.*\n)?\s*(\d{7})

string sText = @" ..." // all the different patterns you posted. I think I have 4
Regex regex = new Regex(@"L\s*(\d{6})\s*(?:'.*\n)?\s*(\d{7})", RegexOptions.Multiline);
foreach (Match everyMatch in regex.Matches(sText))
{
  Console.WriteLine("L {0}, {1}", everyMatch.Groups[1], everyMatch.Groups[2]);
}

Выходы:

L 305455, 1025446
L 300216, 0915302
L 322823, 0923754
L 322441, 0994055
0 голосов
/ 06 мая 2009

Вы можете попытаться помочь в сопоставлении, применяя допустимые значения долготы / долготы. 0994055, кажется, означает 99 40 '55 ". Если это так, это означает, что ваша первая цифра всегда будет 1 или 0 (я думал, что это может быть от 0-360, так как не указано никакого знака, но нет знака либо lat, и это, как представляется, ограничено 6 символами, что указывает на то, что знак либо хранится в другом месте, либо не хранится вообще).

Так что вместо (\ d {7}), возможно, попробуйте ([01] \ d {6})

Я также заметил шаблон с '###### после лат и лон, он всегда один и тот же. Поэтому, возможно, попробуйте использовать обратную ссылку:

L\s*(\d{6})\s*(('\d*)\s*.*\n)?\s*(\d{7}(\s*\3)?)

Вы также можете попытаться создать регулярные выражения меньшего размера, специфичные для каждого общего случая (многострочный, однострочный и т. Д.), Разделив их знаком или |. Регулярное выражение будет немного уродливым, но, возможно, будет проще найти решение.

Удачи!

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