Regex: Lookaround && некоторый синтаксис - PullRequest
1 голос
/ 02 сентября 2010

Я изучаю регулярное выражение и поражен концепцией

  1. *

    и

  2. с небольшим синтаксисом.

После поиска в Google я подумал, что это правильный форум, чтобы попросить о помощи.Пожалуйста, помогите с этой концепцией.

Поскольку я не очень хорошо понимаю объяснение.Будет здорово, если я получу множество различных примеров для понимания.

Для меня модификаторы /e и || являются новыми в регулярных выражениях, пожалуйста, помогите мне понять реальное использование.Ниже мой Perl-скрипт.

$INPUT1="WHAT TO SAY";
$INPUT2="SAY HI";
$INPUT3="NOW SAY![BYE]";
$INPUT4="SAYO NARA![BYE]";

$INPUT1=~s/SAY/"XYZ"/e;   # /e What is this modifier is for

$INPUT2=~s/HI/"XYZ"/;

$INPUT3=~s/(?<=\[)(\w+)(?=])/ "123"|| $1 /e; #What is '||' is use for and what its name
$INPUT4=~s/BYE/"123"/e;

print "\n\nINPUT1 = $INPUT1 \n \n ";
print "\n\nINPUT2 = $INPUT2 \n \n ";
print "\n\nINPUT3 = $INPUT3 \n \n ";
print "\n\nINPUT4 = $INPUT4 \n \n ";

Ответы [ 2 ]

6 голосов
/ 02 сентября 2010

Иметь чтение perlrequick и perlretut .

Модификатор /e оператора замены s/// обрабатывает замену как код Perl, а нестрока.Например:

$x = "5 10"
$x =~ s/(\d+) (\d+)/$1 + $2/e;
# $x is now 15

Вместо замены $ x на строку "$ 1 + $ 2", он оценивает код Perl $1 + $2 - где $ 1 - 5, а $ 2 - 10 - и помещаетрезультат в $ x.

|| - это , а не оператор регулярного выражения, это обычный оператор Perl.Это логический оператор или: если левая сторона является истинным значением (не 0 или ''), она возвращает левую сторону, в противном случае она возвращает правую сторону.Вы можете искать операторы Perl в perlop .

3 голосов
/ 02 сентября 2010

Стандартный оператор замещения выглядит так:

s/PATTERN/REPLACEMENT/

При совпадении ШАБЛОНА он заменяется на ЗАМЕНУ. ЗАМЕНА обрабатывается как строка в двойных кавычках, так что вы можете поместить туда переменные, и это будет просто работать.

s/PATTERN/$var1/

Вы можете использовать это, чтобы включить кусочки соответствующего теста в вашу замену.

s/PA(TT)ERN/$1/

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

#!/usr/bin/perl

use strict;
use warnings;

$_ = '12.34 5.678';

s/(\d+\.\d+)/int($1)/g;

print "$_\n";

Это не работает, конечно. Вы получите «int (12.34) int (5.678)». Но эта строка представляет собой кусок кода, который вы хотите запустить, чтобы получить правильный ответ. Вот что делает опция / e. Он обрабатывает замещающую строку как код, запускает ее и использует вывод в качестве замены.

Изменение строки в приведенном выше примере на

s/(\d+\.\d+)/int($1)/ge;

дает нам требуемый результат.

Теперь, когда вы понимаете, я надеюсь, что вам не нужно объяснение ||. Это просто стандарт или оператор, который вы используете все время. В вашем примере это означает, что «строка замены имеет значение« 123 »или содержимое $ 1». Конечно, это не имеет большого смысла, поскольку «123» всегда будет истинным, поэтому $ 1 никогда не будет использоваться. Возможно, вы хотели наоборот - $ 1 или «123».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...