Извлечение данных из текстового файла - повторные значения - PullRequest
0 голосов
/ 06 декабря 2011

79 0009! 017009! 0479% 0009! 0479 0009! 0469% 0009! 0469 0009! 0459% 0009! 0459'009 0009! 0459% 0009! 0449 0009! 0449% 0009! 0449 0009! 0439% 0009! 0439 0009! 0429% 0009! 0429'009 0009! 0429% 0009! 0419 0009! 0419% 0009! 0409 000'009! 0399 0009! 0389% 0009! 0389'009 0009! 0379% 0009! 0369 0009! 0349% 0009! 0349 0009! 0339% 0009! 0339 0009! 0339% 0009! 0329'009 0009! 0329% 0009! 0329 0009! 032

В этих данных я должен извлечь число 47, 46, 45, 44 и так далее. Я должен избегать остальных. Числа всегда следуют за этим потоком - 9! 0 нет 9% например: 9! 0 42 9% На каком языке мне следует решить эту проблему, и какая функция может мне помочь? Есть ли функция, которая может позиционировать специальный символ и копировать следующие два или три элемента? Например: 9! 0 42 9% и '009 берегись! а затем скопируйте 42 оттуда и найдите «который относится к другому значению (009). Это как два разных регулярных выражения.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2011

Это perl:

@result = $subject =~ m/(?<=9!0)\d+(?=9%)/g;

Это даст вам массив всех ваших чисел.Вы не указали язык, поэтому я не знаю, подходит ли он вам или нет.

Pattern regex = Pattern.compile("(?<=9!0)\\d+(?=9%)");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    // matched text: regexMatcher.group()
    // match start: regexMatcher.start()
    // match end: regexMatcher.end()
} 
0 голосов
/ 07 декабря 2011

Другие ответы в порядке, мое решение для регулярных выражений просто "9!. (\ D \ d)"

А вот полное решение в powershell, которое можно легко соотнести с другими .net langs

$t="79 0009!017009!0479%0009!0479 0009!0469%0009!0469 0009!0459%0009!0459'009 0009!0459%0009!0449 0009!0449%0009!0449 0009!0439%0009!0439 0009!0429%0009!0429'009 0009!0429%0009!0419 0009!0419%0009!0409 000'009!0399 0009!0389%0009!0389'009 0009!0379%0009!0369 0009!0349%0009!0349 0009!0339%0009!0339 0009!0339%0009!0329'009 0009!0329%0009!0329 0009!032"
$p="9!.(\d\d)"
$ms=[regex]::match($t,$p)
while ($ms.Success) {write-host $ms.groups[1].value;$ms=$ms.NextMatch()}
0 голосов
/ 06 декабря 2011

Вы можете использовать любой язык, который вы хотите, или даже утилиту командной строки Unix, такую ​​как sed, awk или grep.Регулярное выражение должно быть примерно таким - вы хотите соответствовать 9! 0, за которыми следуют цифры и 0%.Используйте это регулярное выражение: 9!0(\d+)0% (или, если все числа состоят из двух цифр, 9!0(\d{2})0%).

...