2009-09-08 4 views
2

Использование регулярного выражения Perl или unix, как бы захватить слово, которое не является диапазоном значений. Вот чего я пытаюсь достичь.Как я могу совместить слова, которые не являются определенными словами?

(\w:not('int','long')) 
+1

На всякий случай, когда вы говорите 'int' и 'long', вы имеете в виду строки * 'int' и 'long', или вы имеете в виду переменные типы (как в C)? Я уверен, что вы имеете в виду строки, но на всякий случай ... – Telemachus

+0

, так что не лучше ли говорить о наборах, а не о диапазонах? – innaM

+0

Да, я имею в виду строки :) – Ryall

ответ

9

Не уверен, если это верно синтаксис Perl, но в «общий» аромат вы можете сказать

/\b(?!int\b|long\b)\w+\b/ 

Если вы хотите, чтобы захватить слово, поставить скобки вокруг \w+, как это

/\b(?!int\b|long\b)(\w+)\b/ 
+0

Вот что я бы сделал. –

+0

@Adam: вам не нужно '(\ w +)', чтобы захватить то, что мы хотим найти? Или я смущен? (I.e., вам нужны парнеры, чтобы иметь доступный предмет в '$ 1', нет?) – Telemachus

+0

@Telemachus: Ой, вы правы! Мне нужно больше кофе. Я читал «матч», где письма четко пишут «захват». –

6

это, как правило, быстрее сказать:

my %exclude = map { $_ => 1 } qw/int long/; 
my @words = grep { not exists $exclude{$_} } /(?:\b|^) (\w+) (?:\b|$)/gx; 

особенно в версиях Perl до 5.10 (когда чередование получило значительное увеличение скорости).

+0

Красивый подход. Тщательно общий :) –