需要帮助在 Perl 中创建一个简单的正则表达式

发布于 2024-12-07 05:06:31 字数 262 浏览 1 评论 0原文

在创建正则表达式模式时我仍然没用。这一定非常容易。

给定字符串: /home/users/cheeseconqueso/perl.pl

我想将字符串 ./ 放在最后一个 / 前面> 在原始字符串中生成: /home/users/cheeseconqueso/./perl.pl

提前致谢 - 我相信这个简单的例子将帮助我解决许多其他愚蠢的事情别在这儿!

I'm still useless when it comes to creating regex patterns. This one has got to be really easy.

Given the string: /home/users/cheeseconqueso/perl.pl

I want to place the string ./ right in front of the very last / in the original string to produce: /home/users/cheeseconqueso/./perl.pl

Thanks in advance - I'm sure this simple example will help me for a lot of other stupid stuff that shouldn't be up here!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

任性一次 2024-12-14 05:06:31

这是我的解决方案,基于我对您的问题发表评论时的想法:

use strict;
use warnings;

my $str = '/home/users/cheeseconqueso/perl.pl';
my @arr = split('/',$str);
my $newstr = join('/', @arr[0..(@arr-2)], '.', $arr[-1]);

编辑:如果您真的热衷于使用正则表达式,这是我发现的最简单的解决方案:

$str =~ s|(.*/)(.*)|$1./$2|;

它利用第一组中初始 * 的贪婪性来获取直到最后一个 / 的每个字符,然后匹配第二组中的所有其他字符。使用 | 分隔符更容易阅读,这样您就可以避免牙签倾斜综合症。

Here's my solution based on what I was thinking of when I left the comment to your question:

use strict;
use warnings;

my $str = '/home/users/cheeseconqueso/perl.pl';
my @arr = split('/',$str);
my $newstr = join('/', @arr[0..(@arr-2)], '.', $arr[-1]);

Edit: If you're really keen on using a regex, this is the simplest one I've found:

$str =~ s|(.*/)(.*)|$1./$2|;

It takes advantage of the greediness of the initial * in the first group to take every character up to the last /, then matches everything else in the second group. It's a little easier to read with the | delimiters so you avoid leaning toothpick syndrome.

2024-12-14 05:06:31
my $variable = "/home/users/cheeseconqueso/perl.pl";

$variable =~ s/(.*\/)([^\/]+)$/$1\.\/$2/;
my $variable = "/home/users/cheeseconqueso/perl.pl";

$variable =~ s/(.*\/)([^\/]+)$/$1\.\/$2/;
时常饿 2024-12-14 05:06:31

这是使用 File::Basename 而不是正则表达式,如果您发现很难编写正则表达式,您可以使用此 cpan 模块。

use File::Basename;
$path = '/home/users/cheeseconqueso/perl.pl';
$newpath = dirname($path) . './'.basename($path);

this is using File::Basename not with regex, you can use this cpan module if you find hard to write regex.

use File::Basename;
$path = '/home/users/cheeseconqueso/perl.pl';
$newpath = dirname($path) . './'.basename($path);
隔岸观火 2024-12-14 05:06:31

实际上,您不需要正则表达式,只需分割字符串即可:

my $str='/home/users/cheeseconqueso/perl.pl';

#Array: ('','home','users','cheeseconqueso','perl.pl')
my @arr=split(/\//,$str); 

my $output=join('/',@arr[0..($#arr-2)]); # '/home/users/cheeseconqueso'
$output.='/./' . $arr[$#arr]; #Pops on the '/./' and the last element of @arr.

You actually don't need a regex, you can just split the string:

my $str='/home/users/cheeseconqueso/perl.pl';

#Array: ('','home','users','cheeseconqueso','perl.pl')
my @arr=split(/\//,$str); 

my $output=join('/',@arr[0..($#arr-2)]); # '/home/users/cheeseconqueso'
$output.='/./' . $arr[$#arr]; #Pops on the '/./' and the last element of @arr.
青芜 2024-12-14 05:06:31
s/(.*)\/(.*)/\1.\/\2/

正如 CanSpice 所指出的, split 在这里也可以很好地工作。

s/(.*)\/(.*)/\1.\/\2/

As noted by CanSpice, split works fine here too.

风向决定发型 2024-12-14 05:06:31

试试这个:

my $str = "/home/users/cheeseconqueso/perl.pl";
if($str =~ /^(.*)(\/)(\w+\.\w+)$/) {
    $str = $1.'/.'.$2.$3;
}

Try this:

my $str = "/home/users/cheeseconqueso/perl.pl";
if($str =~ /^(.*)(\/)(\w+\.\w+)$/) {
    $str = $1.'/.'.$2.$3;
}
扶醉桌前 2024-12-14 05:06:31

正则表达式?我们不需要讨厌的正则表达式。

左值 substr() 来救援!

#!/usr/bin/perl
use warnings;
use strict;

$_ = "/home/users/cheeseconqueso/perl.pl\n";
substr($_, rindex($_, '/'), 0) = '/.';
print;

Regex? We don't need no stinkin' regex.

l-value substr() to the rescue!

#!/usr/bin/perl
use warnings;
use strict;

$_ = "/home/users/cheeseconqueso/perl.pl\n";
substr($_, rindex($_, '/'), 0) = '/.';
print;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文