繁体   English   中英

C#Regex.replace(regex,替换)奇怪的行为

[英]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))

现在它匹配了-在文件名jpgjpeg ,我从结尾处删除了""{0,1} ”。

在两个内容示例中:

比赛1

  1. /媒体/ 1048 /
  2. 300x300的-tK3s__MG_4391
  3. .JPG

比赛2

  1. /媒体/ 1047 /
  2. 300X300tk3s_M1Y9216
  3. .JPG

工作示例: http : //regex101.com/r/jR1cX1 (还要注意转义的斜杠-它们不应该影响C#,但以防万一...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM