Замещающее регулярное выражение - PullRequest
0 голосов
/ 24 августа 2010

Я хочу заменить все пробелы, которые предшествуют классу [A-Za-z0-9_], на $.

$string = "STRING sDir = sDrive";
$string =~ s/\s(?=[A-Za-z0-9_])/ \$/;

Это соответствует только один раз и производит:

STRING $sDir = sDrive;

Ответы [ 3 ]

3 голосов
/ 24 августа 2010

Чтобы соответствовать несколько раз, используйте флаг / g:

$string = "STRING sDir = sDrive";
$string =~ s/\s(?=[A-Za-z0-9_])/ \$/g;
2 голосов
/ 24 августа 2010

Вы можете использовать флаг g для своего регулярного выражения:

$string = "STRING sDir = sDrive";
$string =~ s/\s(?=[A-Za-z0-9_])/ \$/g;

, так что s/// будет работать для каждого совпадения для вашего шаблона.

По умолчанию поведение Perl равновыполнить замену один раз.

Флаг g указывает ему выполнять замену для каждого вхождения.

0 голосов
/ 24 августа 2010

если я думаю, что вы имеете в виду, что вы имеете в виду:

s/\s+\b/ \$/g;

это удаляет все пробелы ранее (поэтому ' a' -> ' $a') и \ b является утверждением либо (?=(?<=\W)\w), либо (?=(<=\w)\W_; \ s всегда \W, а [a-zA-Z0-9_] соответствует общему определению \w, поэтому оно соответствует вашему (?=[...]).

(конечно, если вы имеете дело с наборами символов, в которых \w не совпадает с [a-zA-Z0-9], вам придется заменить \b на утверждение.)

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