Извлечение данных из текстового файла — повторяющиеся значения

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). Это похоже на использование двух разных регулярных выражений.


person Siddharthan Asokan    schedule 06.12.2011    source источник


Ответы (3)


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

person Dan    schedule 06.12.2011

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

А вот полное решение в powershell, которое можно легко сопоставить с другими языками .net.

$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()}
person Elroy Flynn    schedule 07.12.2011

Это перл:

@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()
} 
person FailedDev    schedule 06.12.2011
comment
Java очень предпочтительнее - person Siddharthan Asokan; 07.12.2011