您好我非常感谢帮助形成一个从字符串末尾删除一个百分比的正则表达式:
Film name (2009) 58% -> Film name (2009)
Film name (2010) 59% -> Film name (2010)
该字符串可能有也可能没有括号内的年份。在方括号内的年份之前,电影名称可能是字母数字,并且有多个单词。
我正在使用“批量重命名实用程序”,因此我希望填写“匹配”和“替换”字段。
我能想到的最好的是:
([A-Z][a-z]*) \((\d*)\) (\d*\%) --> \1 (\2)
虽然这似乎只适用于单字电影名称,但丢失括号所以我不得不重新添加!
我是google,每次尝试可能的表达式时,它都不适用于'批量重命名实用程序',我认为它基于pcre(Bulk Rename Utility)。
答案 0 :(得分:4)
使用
非常简单s/\s*\d+%$//
删除后跟一个数字的尾随字符串,后跟一个百分号,以及任何前面的空格字符
use strict;
use warnings;
while (<DATA>) {
s/\s*\d+%$//;
print;
}
__DATA__
Film name (2009) 58%
Film name (2010) 59%
<强>输出强>
Film name (2009)
Film name (2010)
答案 1 :(得分:2)
我不熟悉该实用程序,但作为替代,通常只更换[0-9]+%
没有任何工作。但是,如果有任何影片的名字有百分比,请小心!
答案 2 :(得分:2)
为避免更换错误的内容,请执行此操作
\b(100|\d{1,2})%\b
并替换为零。
它在单词边界处停止(即30%没有问题,但w30%没有)并且只获得100或0-99个数字。
修改强>
如果%是字符串的最后一个字符,则可以在执行
时获得更好的结果\b(100|\d{1,2})%$
这样你只能获得行尾的%
,避免从电影片名中删除带有%的数字。
如果字符串是文件名,你需要更换它,你不能只删除部分瓷砖,你可以这样做
(.+?)(100|[0-9]{1,2})%$ #I think using 0-9 is accepted by more languages
并替换为
$1
\1
和\2
不应在替换表达式中使用。它们是正则表达式模式,匹配第一个和第二个捕获匹配的模式。 $1
和$2
是包含第一个和第二个匹配匹配内容的变量,因此您应该使用这些变量。
答案 3 :(得分:0)
你很幸运,百分比(如果存在)总是最后一件事。只需将其作为关键事实,并且不尝试匹配其他任何内容。 (作为RE的一般规则,匹配你不会改变的东西只会增加出错的机会,而不提供任何好处 - 如果你必须 em>确定您所关注的部分的位置。)
我的猜测是以前的一些答案或多或少是正确的,但有一个没有用,因为你在所有'}'和''''''中都有拼写错误和'\'(正则表达式必须是完全,反斜杠不是正斜杠,方括号不是花括号不是paren,加上不是星形,小写不是上 - case,你不能在任何地方添加任何空格,等等)并且大多数都不起作用,因为你有时在字符串的末尾有尾随空格。所以当你的“匹配”字段使用
时
\s+(100|\d\d?)%\s*$
让你的“替换”字段完全为空。
(另一个想法:你的某些数据可能在数字和百分号之间有空格[如:foo bar(2012)83%)?如果是这样,请修改“匹配”字段以允许该可能性 \ S +(100 |?\ d \ d)\ S *%\ S * $
答案 4 :(得分:0)
以下是我的建议:
^([1-9]([0-9])*?|0)(\.[0-9]+)?%?$
匹配&#34; 12&#34;,&#34; 0.123&#34;,&#34; 12.44&#34;,&#34; 102.12345&#34;以及最终的百分比&#34; 11.22%&#34;,&#34; 11%&#34; ....
将小数位与小数点前后的任意位数匹配,并使用&#34;%&#34;最后的字符(当然,点和%是可选的)。
希望它有所帮助;)