Неиспользуемые регулярные выражения в Ruby - PullRequest
1 голос
/ 24 мая 2011

У меня есть скрипт, который обрабатывает содержимое файла из программы CAD для использования в другой программе CAD.Можно ли пропустить неиспользуемые переменные в блоке или переписать их?Сценарий отлично работает с ними на месте, мне было просто любопытно, если бы был более чистый способ написать это.Спасибо.

    string = IO.read("file.txt")

    string.scan(/regex/m) {|a,b,c,d,e,f,g|

    # captures 7 items, I use 1-4, & 6 below, skipping 5 & 7

    print a, b+".ext", c.to_f/25400000, d.to_f/25400000, f,"\n"
    }

Мой вопрос лежит в последней строке - если я не использую их все - мне все равно нужно объявлять их все, чтобы он работал правильно и оставался в правильном порядке?

Элементы 5 и 7 могут быть использованы позднее, но на данный момент они являются лишь частью регулярного выражения для будущей гибкости.

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

Поскольку вы получаете переменные как блочные переменные, вы не можете пропустить порядок. Проблема в вашем регулярном выражении. Если у вас есть группа, которую вы не хотите захватывать, вы должны использовать группу захвата (?: ) вместо группы захвата ( ). Поэтому измените пятое и седьмое ( ) в своем регулярном выражении на (?: ). Если вы используете ruby ​​1.9 или используете движок oniguruma regex на ruby ​​1.8.7, вы также можете использовать именованные захваты; например, используйте (?<foo> ) в регулярном выражении и ссылайтесь на захваченную строку в блоке как foo или $~[:foo].

1 голос
/ 24 мая 2011

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

string.scan(/regex/m) { |a|
    print a[0], a[1] + ".ext", a[2].to_f / 25400000, a[3].to_f / 25400000, a[5], "\n"
}

Либо это, либо переделайте свое регулярное выражение, чтобы получить только то, что вам нужно.

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

string.scan(/regex/m) { |a, b, c, d, unused, f, unused|
    print a, b + ".ext", c.to_f / 25400000, d.to_f / 25400000, f, "\n"
}

По крайней мере, такочевидно (или должно быть), что вы не используете пятый и седьмой снимки.Однако это не работает в 1.9, поэтому вам придется использовать unused1 и unused2 в 1.9.

Идеальным балансом было бы использование именованных групп захвата 1.9, но scan не делаетне дать вам доступ к ним.

...