2014-09-25 1 views
2

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

# Pre-append "$" to variable names. 
# ['"](?:[^'"]*?(?:\\")*)*["'] Matches strings within double or single quotes. 
# (*SKIP)(*F) Causes the preceding pattern to fail. Tries to match the pattern on the right side of the | operator using the remaining strings. 

my $temp = $entire_line;  
while ($temp =~ /['"](?:[^'"]*?(?:\\")*)*["'](*SKIP)(*F)|([A-Za-z0-9_]+)/g){ 
    my $variable_name = $1;  
    $entire_line =~ s/$variable_name/\$$variable_name/;  
} 

Учитывая $entire_line = ((factor0 + factor1) * factor2) + factor0

Я хотел бы мой выход быть:

(($factor0 + $factor1) * $factor2) + $factor0

Однако, я м:

(($$factor0 + $factor1) * $factor2) + factor0

Я знаю, что это происходит потому, что он находит первый экземпляр factor0 дважды. Есть ли хороший способ предотвратить это и заменить найденный экземпляр?

Также мне нужно использовать переменную $temp?

Благодарим за помощь.

ответ

2
(\w+) 

Использование this.Replace с $$1.

См. Dmeo.

http://regex101.com/r/qC9cH4/17

+0

Это будет работать только для данного примера. В основном также делает весь сложный синтаксический анализ ненужным. Но, скорее всего, «factorn» был всего лишь примером. – simbabque

+0

@simbabque вы можете показать пример – vks

+1

@vks Спасибо за это. Оказывается, мне не нужно слишком сложное регулярное выражение. Я использовал его раньше и повторил. – 2014-09-25 11:25:17

2

Длинное регулярное выражение не находит первые factor0 дважды. Это простое регулярное выражение в подстановке. Чтобы это получилось, вам нужно убедиться, что он не находит те, которые начинаются с $.

$entire_line =~ s/([^\$])$variable_name/$1\$$variable_name/;  

Вы можете просто использовать $entire_line с этим решением и избавиться от $temp, но это очень сбивает с толку в целом. Если это производственный код, я предлагаю вам добавить комментарии к коду, а также к регулярному выражению, используя флаг /x. Your future self will thank you later.


Проверьте регулярное выражение здесь: http://regex101.com/r/vX0aJ9/1

+0

@AvinashRaj да, действительно. Проверьте информацию о матче справа: MATCH 1 1. \t [2-9] \t 'factor0' MATCH 2 1. \t [12-19] \t' factor1' MATCH 3 1. \t [23-30 ] \t 'factor2' MATCH 1. \t [34-41] \t' factor0' – simbabque

+0

yep, он соответствует 4 факторам. –

+0

@simbabque Спасибо за помощь. – 2014-09-25 13:44:57

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