2013-10-05 5 views
0

Мне новичку в Perl нужно некоторое пособие по регулярному выражению Perl. Я хочу извлечь слова из файла, который может содержать только символы UPPERCASE и/ИЛИ числовые цифры и символы подчеркивания (либо в начале, либо в конце слова или посередине). Разделитель для слов может быть пробелом или любым другим прописным, несимметричным, без подчеркивания.Извлечь заглавные слова с необязательными номерами и символами подчеркивания

3 примеры:

abcd _PARAM123="dfd"; (I want to extract _PARAM123) 
abcd PARAM2_:12; (I want to extract PARAM2_) 
abcd PARA_M-1; (I want to extract PARA_M) 
+0

Нужно ли поддерживать UTF8, кодовые точки выше 127? – DavidO

+0

@Jerry - Я инженер по оборудованию и изучаю Perl для анализа моих журналов и т. Д. Я новичок в том, что я не получил за пределами массивов, хэшей и простых замен. Я был онлайн-поиском в Интернете для «извлечения строк» ​​и не смог добиться значительного прогресса и нашел регулярное выражение довольно озадачивающим (я пробовал много вещей, которые могут показаться чересчур глупыми и многочисленными, чтобы они были перечислены); поэтому мне нужна была помощь, чтобы быстро исправить мою проблему и учиться в моем собственном темпе; эрго вопрос. Спасибо – user2805732

+0

Хорошо, конечно. И могли бы вы предоставить еще несколько образцов? Как насчет 'abcd 1PARAM_T = 3' Вы хотите извлечь' 1PARAM_T'? Или что, если у вас есть 'abcd PARAM = PARAM2'? – Jerry

ответ

1

Вы можете

my @words = $str =~ /([A-Z_] [0-9A-Z_]+)/xg; 
+0

Джерри: Да, я делаю это предположение, потому что кажется, что OP, возможно, просто забыл упомянуть. Я не доверяю спецификации, поэтому я не собираюсь писать ответ, который включает в себя вариации для решения любой возможной интерпретации вопроса. :) Но я верну свой намек, так как я просто догадываюсь о реальной спецификации. – DavidO

+0

@ DavidO Я знаю, просто указывая. Я думаю, что на такие вопросы не следует отвечать до тех пор, пока OP не станет полностью понятным. – Jerry

+0

Мы все еще даже не знаем, что он считает верхним регистром: Нужно ли ему поддерживать кодовые точки выше 127? – DavidO

1

Поскольку вы не ответили на мой последний запрос, я буду считать, что слово не считается словом если есть только числа (и/или подчеркивания), например 12 и 1_2 не считаются словами.

В этом случае, я полагаю, это регулярное выражение:

(?=[0-9_]*[A-Z])\b[A-Z0-9_]+\b 

regex101 demo

(?=[A-Z0-9_]*[A-Z]) является положительным опережением и убеждается, что есть по крайней мере один символ верхнего регистра в регулярном выражении. Если вы считаете 1_2 словом, вместо этого используйте (?=[A-Z0-9_]*[A-Z_]).

\b является границей слов и является тем, что гарантирует отсутствие строчных символов, прикрепленных к слову, которое вы ищете.

[A-Z0-9_] является символьным классом и будет соответствовать любому символу в диапазоне A-Z (заглавные буквы), 0-9 (цифры) и символ подчеркивания.

+ означает, что предыдущая группа или символ могут встречаться 1 или более раз.

+0

Большое спасибо, Джерри. – user2805732

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