【问题标题】:c# Regex.replace(regex, replacement) odd behaviourc# Regex.replace(regex, replacement) 奇怪的行为
【发布时间】: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,这些示例只是用来说明它不起作用的实例。

标签: c# regex replace


【解决方案1】:

不确定表达式中的某些对象到底应该完成什么,但假设您只是想分别捕获路径、文件名和扩展名,这个清理后的表达式应该适合您:

(\/media\/\d+\/)([\w-]+)(\.(?:png|gif|jpe?g|pdf|bmp))

它现在匹配文件名中的-jpgjpeg,我从末尾删除了""{0,1}

关于您的两个内容示例:

第一场比赛

  1. /media/1048/
  2. 300x300-tK3s__MG_4391
  3. .jpg

第 2 场

  1. /media/1047/
  2. 300X300tk3s_M1Y9216
  3. .jpg

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

【讨论】:

  • 嗯,我还是有同样的问题,replace 方法与 match 做的事情不同,所以在使用 Groups 属性时 - 并且总是如此 - Replace 方法做的事情不同。
  • 好的,你能详细说明问题吗?或者你已经这样做了?另请参阅 - 可能是原因:stackoverflow.com/questions/8432983/…
  • 是的,这就是我看到的问题。将反向引用包装在花括号中后,例如 r.Replace(content, "${1}" + newname + "${3}") 我得到了预期的结果。
猜你喜欢
  • 2020-02-03
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2019-04-10
  • 2019-05-24
  • 2016-07-15
相关资源
最近更新 更多