2012-02-17 6 views
0

Я делаю поиск файлов и замену для вхождения определенных слов в perl. Обычно я не являюсь пользователем perl или regex. Я искал другие вопросы регулярного выражения здесь, но я не мог найти тот, который был совершенно прав, поэтому я прошу о помощи. Мой поиск и замена в настоящее время выглядит следующим образом:Regex, чтобы соответствовать всему слову с определенным определением слова

s/originalword/originalword_suffix/g 

Это соответствует случаям originalword, которые появляются в середине другого слова, которые я не хочу. В моем применении поиска и замены целое слово можно определить как имеющее буквы латинского алфавита в строчных или заглавных буквах, а цифры 0-9 и символ _ в любой непрерывной последовательности. Все остальное, кроме этих символов, включая любые другие символы или любую форму пробела, включая разрывы строк или вкладки, указывает операции или разделители какого-либо типа, чтобы они были вне границ слова. Как изменить мой поиск и замену, чтобы соответствовать только целым словам, как я их определил, без соответствующих подстрок?

Примеры:

в том случае, originalword = кошка и originalword_suffix = cat_tastic

:cat { --> :cat_tastic { 
:catalog { --> no change 
+0

Вы имеете в виду «слово весь» вариант? – Armin

ответ

2

Используйте \ б якорь, чтобы соответствовать только на границе слова:

s/\bcat\b/cat_tastic/g 

Хотя Perl имеет несколько иное определение того, что такое «слово». Несколько раз прочитав справочное руководство perlre, вы можете лучше понять регулярные выражения.

Выполнение perl -pi -e "YOUR_REGEXP" в терминале и ввод строки текста может помочь вам понять и отладить то, что делает определенное регулярное выражение.

+0

Спасибо за ответ и указатель на документы, это привело меня на правильный путь. – Halle

+0

@TimPotter, но почему '\ b [- | +] [0-9] + \ b' matche' + 10' в '43E + 10'. – alhelal

0

Вы можете попробовать:

s/([^0-9a-z_])([0-9a-z_]+)([^0-9a-z_])/$1$2_tastic$3/gi 

В основном, не-буквенный символ, то набор символов слова, а затем без слов характер. $ 1, $ 2, $ 3 представляют захваченные группы, и вы заменяете $ 2 $ 2_suffix.

Надеюсь, что это поможет, а не человек perl купить довольно регулярное выражение. Обратите внимание, что приведенное выше не будет выполнено, если слово является самой первой или самой последней вещью в строке. Не уверен, что если Perl regexen позволяют синтаксис, но если это так, фиксируя первый/последний вопрос может быть сделано с:

s/(^|[^0-9a-z_])([0-9a-z_]+)([^0-9a-z_]|$)/$1$2_tastic$3/gi 

Использование^и $, чтобы соответствовать начало/конец строки.

0

Смотрите пример на this page, который объясняет краевым matchers

Enter your regex: \bdog\b 
Enter input string to search: The dog plays in the yard. 
I found the text "dog" starting at index 4 and ending at index 7. 

Enter your regex: \bdog\b 
Enter input string to search: The doggie plays in the yard. 
No match found. 
Смежные вопросы