【发布时间】:2013-12-17 17:12:36
【问题描述】:
我有一个在 .Net 4.5 上运行的代码 sn-p,大致如下:
function string replace(string content, string newfilename ) {
Regex r = new Regex(@".*(/media/\d+/)(\w+)(\.(?:png|gif|jp{0,1}g|pdf|bmp))""{0,1}");
var str1 = string.Empty;
var str2 = string.Empty;
var m = r.Matches(content);
if (m.Count > 0)
{
str1 = r.Replace(content, "$1" + newfilename + "$3");
str2 = m[0].Groups[1].Value + newfilename + m[0].Groups[3].Value;
}
...
给定输入(每个字符串调用一次,新名称与正则表达式匹配组 2 相同)
内容#1:
/media/1048/300x300-tK3s__MG_4391.jpg
str1:
/media/1048/300x300-tK3s__MG_4391.jpg
str2:
/media/1048/300x300-tK3s__MG_4391.jpg
内容#2:
/media/1047/300X300tk3s_M1Y9216.jpg
str1:
$1300X300tk3s_M1Y9216.jpg
str2:
/media/1047/300x300tK3s__M1Y9216.jpg
第二个字符串的 r.Replace() 语句中发生了什么?为什么我得到 $1 newfilename $3?此特定示例中的唯一区别是有效字符串中的破折号和无效字符串中缺少破折号。
(请注意,输入字符串可能以 html 标记开头,因此正则表达式开头的 .*)
编辑 我想要完成的是使用 /media/(int)/(filename).(extension) 的基本格式重命名一组文本引用中的一组文件,因此这些示例并不理想。给定第二个示例,其中 newfilename 参数的值为 MynewImage ,结果将是 $1MynewImage.jpg 我本来希望它是 /media /1047/MynewImage.jpg.
而且 \w 不匹配的破折号似乎不正确,它确实匹配破折号,当有破折号时,替换方法有效,当没有破折号时它不匹配并返回分组参数字面上而不是第一个捕获组的实际值。但不适用于所有带有破折号的文件名,仅适用于这些文件名。
【问题讨论】:
-
模式末尾的
""{0,1}是什么意思? -
您的正则表达式与第一个字符串不匹配 -
\w不包含-字符。在第二个字符串上运行代码会产生预期的结果:/media/1048/NEWFILENAME.jpg -
""{0,1} 是我认为可能需要它来解析 href 标记中的文件名时遗留下来的。
-
预期结果将是例如 /media/1047/anewfilenamesupplieinthemethod.jpg,这些示例只是用来说明它不起作用的实例。