Я лично люблю/e модификатор к s///операция:
while(<>) {
s/(\w{0,4})/reverse($1);/e; # reverses all words between 0 and 4 letters
print;
}
Вход:
This is a test of regular expressions
^D
Вывод (я думаю):
sihT si a tset fo regular expressions
Похоже, вам нужен какой-то синтаксис регулярного выражения, который говорит: «Если регулярное выражение не соответствует какой-либо части данной строки, сделайте вид, что оно соответствует следующей подстроке: 'foobar'». Такой возможности нет ни в одном синтаксисе регулярных выражений, который я видел.
Возможно, вам понадобится что-то вроде этого:
matched_string = string.find_regex_match(regex);
if(matched_string == null) {
string = "default";
}
(Это, конечно, нужно будет отрегулировать в соответствии с языком, который вы используете)
Трудно ответить на этот вопрос без специального языка, но, по крайней мере, в Perl работает что-то вроде этого:
$string='hello';
$default = 1234;
($match) = ($string =~ m/(\d+)/ or $default);
print "$match\n";
1234
Не является строго частью регулярного выражения, но позволяет избежать лишнего условного блока.
Насколько я знаю, вы не можете сделать это с помощью RegExp, по крайней мере, с помощью регулярных выражений, совместимых с Perl.
Вы можете увидеть сами здесь ].