4

嗨,我真的很感激在形成一个从字符串末尾删除百分比的正则表达式方面的帮助:

Film name (2009) 58%  ->  Film name (2009)
Film name (2010) 59%  ->  Film name (2010)

该字符串可能有也可能没有括号中的年份。在括号中的年份之前,电影名称可能是字母数字并且有多个单词。

我正在使用“批量重命名实用程序”,因此希望填写“匹配”和“替换”字段。

我能想到的最好的办法是:

([A-Z][a-z]*) \((\d*)\) (\d*\%) -->  \1 (\2)

虽然这似乎只适用于单个电影名称,并且丢失了括号,所以我不得不重新添加!

我用谷歌搜索,每次尝试可能的表达方式时,它都无法在我认为基于 pcre (批量重命名实用程序)的“批量重命名实用程序”中工作。

4

5 回答 5

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)
于 2012-09-30T12:56:24.950 回答
2

我不熟悉该实用程序,但作为替代,通常只是用[0-9]+%任何东西替换应该可以工作。但要小心,如果有任何电影名称中有百分比!

于 2012-09-30T11:17:41.430 回答
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是包含第一次和第二次捕获匹配的变量,因此您应该使用它们。

于 2012-09-30T11:26:06.627 回答
0

您很幸运,百分比(如果存在)始终是最后一件事。只需将其用作关键事实,不要尝试匹配其他任何内容。(作为 RE 的一般规则,匹配您不会更改的内容只会增加出错的机会,而不会提供任何好处 -只有在您必须确定您关注的部分的位置时才这样做和。)

我的猜测是之前的一些答案或多或少是正确的,但一个没有奏效,因为你在所有那些 '}' 和 ')' '|' 中都有错字 和 '\' (正则表达式必须准确,反斜杠不是正斜杠,方括号不是大括号不是括号,加号不是星号,小写不是大写,不能加任何白色任何地方的空格,等等)并且大多数都不起作用,因为有时您的字符串末尾有尾随空格。因此,当您的“匹配”字段使用
\s+(100|\d\d?)%\s*$
并让您的“替换”字段完全为空时。

(另一个想法:您的某些数据是否可能在数字和百分号之间有空格[像这样:foo bar (2012) 83 %)?如果是这样,请修改“匹配”字段以允许这种可能性
\s+(100|\d\d?)\s*%\s*$

于 2012-10-01T04:39:51.340 回答
0

这是我的建议:

^([1-9]([0-9])*?|0)(\.[0-9]+)?%?$

匹配“12”、“0.123”、“12.44”、“102.12345”以及末尾的%“11.22%”、“11%”......

匹配小数点前后任意位数的百分比,并在末尾带有“%”字符(点和 % 当然是可选的)。

希望能帮助到你 ;)

于 2018-02-22T12:01:35.590 回答