Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在perl中从字符串中删除字符和数字_Regex_Perl - Fatal编程技术网

Regex 在perl中从字符串中删除字符和数字

Regex 在perl中从字符串中删除字符和数字,regex,perl,Regex,Perl,我试图重命名我目录中的一堆文件,但我被它的正则表达式部分卡住了 我想删除文件名开头出现的某些字符 示例1:\u 00-作者——书籍修订版 预期:作者-书籍(修订版) 到目前为止,我能够使用正则表达式删除下划线并将第一个字母大写 $newfile =~ s/_/ /g; $newfile =~ s/^[0-9]//g; $newfile =~ s/^[0-9]//g; $newfile =~ s/^-//g; $newfile = ucfirst($newfile); 这不是一个好方法。我需要帮

我试图重命名我目录中的一堆文件,但我被它的正则表达式部分卡住了

我想删除文件名开头出现的某些字符

示例1:
\u 00-作者——书籍修订版

预期:
作者-书籍(修订版)

到目前为止,我能够使用正则表达式删除下划线并将第一个字母大写

$newfile =~ s/_/ /g;
$newfile =~ s/^[0-9]//g;
$newfile =~ s/^[0-9]//g;
$newfile =~ s/^-//g;
$newfile = ucfirst($newfile);
这不是一个好方法。我需要帮助删除所有字符,直到你碰到第一个字母,当你碰到第一个'-'时,我想在'-'前后加一个空格。 当我点击第二个“-”时,我想用“(”替换它


任何关于采取正确方法的指导、提示甚至建议都将不胜感激。

您的说明和示例不匹配

按照你的指示

s/^[^\pL]+//;    # Remove everything until first letter.
s/-/ - /;        # Replace first "-" with " - "
s/-[^-]*\K-/(/;  # Replace second "-" with "("
根据你的例子,

s/^[^\pL]+//;
s/--/ - /;
s/_/ (/;
s/_/)/;
s/(?<!\pL)(\pL)/\U$1/g;
s/^[^\pL]+/;
s/--/-/;
s/uu/(/);
s/u/)/;

s/(?您的说明和示例不匹配

按照你的指示

s/^[^\pL]+//;    # Remove everything until first letter.
s/-/ - /;        # Replace first "-" with " - "
s/-[^-]*\K-/(/;  # Replace second "-" with "("
根据你的例子,

s/^[^\pL]+//;
s/--/ - /;
s/_/ (/;
s/_/)/;
s/(?<!\pL)(\pL)/\U$1/g;
s/^[^\pL]+/;
s/--/-/;
s/uu/(/);
s/u/)/;

s/(?如果它们都遵循该格式,请尝试:

my ($author, $book, $revision) = $newfiles =~ /-(.*?)--(.*?)_(.*?)_/;

print ucfirst($author ) . " - $book ($revision)\n";

如果它们都遵循该格式,请尝试:

my ($author, $book, $revision) = $newfiles =~ /-(.*?)--(.*?)_(.*?)_/;

print ucfirst($author ) . " - $book ($revision)\n";
$filename=~s,^\ud+-(.*?)-(.*?)\u1-\u\2(\u\3),;
我的Perl解释器(使用strict和warnings)说这最好写为:

$filename=~s,^\ud+-(.*)-(.*)-(.*)-(.*)(.*)-),\u$1-\u$2(\u$3),;
第一个版本的味道可能更沉闷!(当然,两个版本的效果完全相同。)

解释(按要求):

$filename=~s/
^#匹配行的开头
_\d+-#匹配下划线、一个或多个数字和一个减号
(.*)-#匹配(非贪婪地)连续两次hypen减号之前的任何内容
#并捕获整个匹配(作为第一个捕获组)
(.*)匹配(非greedly)单个下划线和
#捕获整个匹配(作为第二个捕获组)
(.*)35;与之前的操作相同(但将匹配捕获为
#第三组(明显)
$#与行的末尾匹配
/\u$1-\u$2(\u$3)/x;
替换规范中的
\u${1..3}
只是告诉Perl将捕获组从1插入到3,并将它们的第一个字符设为大写。如果要使整个匹配(在捕获组中)大写,则必须改用
\u

x标志打开详细模式,告诉Perl解释器我们要使用#注释,因此它将忽略这些注释(以及正则表达式中的任何空格-因此如果要匹配空格,必须使用
\s
\
).不幸的是,我不知道如何告诉Perl忽略*replacement*规范中的空白-这就是为什么我只写了一行

(还请注意,我已将我的
s
终止符从
更改为
/
——如果我使用
且启用了详细模式,Perl会对我咆哮……不完全清楚原因。)

$code>$filename=~s,^\d+-(.-)(.-(.-)(.-)(.-)\u$,\ u\u\1-\u\2(\u\3),;
我的Perl解释器(使用strict和warnings)说这最好写为:

$filename=~s,^\ud+-(.*)-(.*)-(.*)-(.*)(.*)-),\u$1-\u$2(\u$3),;
第一个版本的味道可能更沉闷!(当然,两个版本的效果完全相同。)

解释(按要求):

$filename=~s/
^#匹配行的开头
_\d+-#匹配下划线、一个或多个数字和一个减号
(.*)-#匹配(非贪婪地)连续两次hypen减号之前的任何内容
#并捕获整个匹配(作为第一个捕获组)
(.*)匹配(非greedly)单个下划线和
#捕获整个匹配(作为第二个捕获组)
(.*)35;与之前的操作相同(但将匹配捕获为
#第三组(明显)
$#与行的末尾匹配
/\u$1-\u$2(\u$3)/x;
替换规范中的
\u${1..3}
只是告诉Perl将捕获组从1插入到3,并将它们的第一个字符设为大写。如果要使整个匹配(在捕获组中)大写,则必须改用
\u

x标志打开详细模式,告诉Perl解释器我们要使用#注释,因此它将忽略这些注释(以及正则表达式中的任何空格-因此如果要匹配空格,必须使用
\s
\
).不幸的是,我不知道如何告诉Perl忽略*replacement*规范中的空白-这就是为什么我只写了一行


(还请注意,我已将我的
s
终止符从
更改为
/
——如果我在启用详细模式的情况下使用
,Perl会对我吼叫……不清楚原因。)

那么,您是希望将新文件名的所有组件大写,还是仅将第一个文件名大写?您的问题在这一点上不一致

请注意,如果您在Linux上,您可能有
rename
命令,该命令将采用perl表达式并使用它为您重命名文件,如下所示:

rename 'my ($a,$b,$r);$_ = "$a - $b ($r)" 
  if ($a, $b, $r) = map { ucfirst $_ } /^_\d+-(.*?)--(.*?)_(.*?)_$/' _*

那么,您是想将新文件名的所有组件都大写,还是只将第一个文件名大写?您的问题在这一点上是不一致的

请注意,如果您在Linux上,您可能有
rename
命令,该命令将采用perl表达式并使用它为您重命名文件,如下所示:

rename 'my ($a,$b,$r);$_ = "$a - $b ($r)" 
  if ($a, $b, $r) = map { ucfirst $_ } /^_\d+-(.*?)--(.*?)_(.*?)_$/' _*

非常感谢!!s/-/-/;我刚刚意识到我的错误。我有一些文件名如上面的示例所示,还有一些文件名为00 author book revision。在这两种情况下,我都希望将这些文件重命名为author-book(revision)。但是您