[英]c# Regex.replace(regex, replacement) odd behaviour
我有一个在.Net 4.5上运行的代码片段,看起来大致像这样:
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新文件名 $ 3? 在此特定示例中,唯一的区别是有效的字符串中的破折号和无效的字符串中的破折号。
(请注意,输入字符串可能以html标记开头,因此正则表达式开头为.*
)
编辑我要完成的工作是使用/media/(int)/(filename).(extension)的基本格式重命名一组文本引用文件中的一组文件,因此这些示例并不是很理想。 给定第二个示例,其newfilename参数值为MynewImage ,结果将是$ 1MynewImage.jpg ,我希望它是/media/1047/MynewImage.jpg 。
并且破折号未与\\ w匹配是不正确的,它确实与破折号匹配,并且当有破折号时,replace方法起作用,在没有破折号的情况下它不起作用并返回分组参数从字面上看,而不是第一个捕获组的实际值。 但是,不是所有带有破折号的文件名,而是这些。
不确定表达式中的某些对象应该完成什么,但是假设您只是想分别捕获路径,文件名和扩展名,则此清理后的表达式应该对您有用:
(\/media\/\d+\/)([\w-]+)(\.(?:png|gif|jpe?g|pdf|bmp))
现在它匹配了-
在文件名jpg
或jpeg
,我从结尾处删除了""{0,1}
”。
在两个内容示例中:
比赛1
比赛2
工作示例: http : //regex101.com/r/jR1cX1 (还要注意转义的斜杠-它们不应该影响C#,但以防万一...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.