2016-12-20 3 views
1

Я пытаюсь создать регулярное выражение, которое фиксирует слово в строке (в основном это имя дискового устройства), но исключая все имена с некоторым форматом. Например:Regex, подходящее для слова, исключая некоторые другие

if (/^\s*(?:\d+\s+){3}(\S+)\s.*/) 

Это регулярное выражение является соответствие:

8  80 7814026584 sdf 

SDF в этой строке. Но есть некоторые RAM-диски, которые я хочу исключить. например, ram1, ram2, ram3, ..ram15 и т. д. Как я могу исключить все устройства, начиная с «ram»?

+0

Как [ '/^\ S * (?: \ D + \ S +) {3} ((?! ram \ d + \ s) \ S +) \ s. */'] (https://regex101.com/r/cndjLc/1). –

ответ

1

На примере, который вы показываете, проще, чем split линии, а затем вы также можете легко обрабатывать.

Я считаю, что четвертое поле всегда является критерием того, следует ли обрабатывать или исключать линию.

Предполагая, что $fh является указатель_на_файлом для файла, который вы обрабатываете

while (<$fh>) 
{ 
    my @fields = split; 

    # Skip this line if the fourth field starts with 'ram' 
    next if $fields[3] =~ /^ram/; 

    # Process as needed 
    # Numbers are at indices 0, 1, 2, and disk device name is $fields[3] 
} 

split выше такого же, как split ' ', $_, где ' ' является любым количеством любого белого пространства.

+0

Спасибо за комментарий. Но регулярное выражение, которое вы указали, жестко закодировано для поля 3 правильно? Что делать, если строка, которую нужно взять в плен, - это что-то вроде: 3 64 78150744 sdf 157 735 2168 1720 1745 437 17432 440 0 1960 2160 Как вы думаете, он все равно захватит sdf и исключит весь барабан? – JavaRed

+0

@JavaRed Приведенный вами пример жестко закодирован тремя номерами, разделенными пробелами. Затем появляется шаблон для принятия ('sdf') или для исключения (' ram'). Если это не всегда так, тогда было бы лучше разделить и манипулировать массивом, чем возиться с регулярным выражением возрастающей сложности. Если 'sdf' в вашем комментарии выше' ram', да, код в моем ответе пропустит эту строку. Это четвертое поле, на котором он проверяет. – zdim

+0

@JavaRed Вы говорите, что у вас может быть «ram» в любом месте на линии, и вам все равно придется пропустить линию? (На самом деле это намного проще.) «Split» в моем ответе разбивает строку пробелами, возвращая все поля в массив. В вашем примере из вышеприведенного комментария он будет иметь первые три числа, затем 'sdf' в четвертом поле, затем еще 11 полей с числами. Массивы начинаются с индекса '0'. Итак, мы проверяем четвертое поле ('$ fields [3]'), и если это '/^ram /', мы переходим на следующую строку. Если нет, мы обрабатываем. Разве это не то, что вам нужно? – zdim

0

Если вам нужен специальный кадр выполнения, я думаю, что это краткое регулярное выражение помогает?

[^ г] + барана \ ш {1,2}

enter image description here

+0

Должен ли я добавить это в конец моего регулярного выражения? if (/^\s*(?:\d+\s+){3}(\S+)\s.*/) – JavaRed

Смежные вопросы