为啥这个正则表达式替换语句没有做任何事情? [复制]
Posted
技术标签:
【中文标题】为啥这个正则表达式替换语句没有做任何事情? [复制]【英文标题】:Why is this regex replace statement failing to do anything? [duplicate]为什么这个正则表达式替换语句没有做任何事情? [复制] 【发布时间】:2020-04-28 05:18:19 【问题描述】:下面是一个小方法,基本上用字符串中的“.png”替换单词“Stack”。因此,名为“Grid01Stack”的内容将返回为“Grid01.png”,但该操作根本不执行任何操作,字符串保持不变。出了什么问题?代码如下:
private string GetUriFromName(string GridName)
string result = Regex.Replace(GridName, @"\bStack\b", ".png");
return (@"Resources/Images/"+result);
【问题讨论】:
第一个单词边界\b
在1S
之间不匹配
1
和 S
之间没有单词边界。 1
和 S
都是单词字符。
\bStack\b
-> Stack\b
你不需要正则表达式。 GridName.Replace("Stack", ".png")
就够了
如果您不打算匹配整个单词,请不要使用单词边界。在这种情况下只需使用string result = GridName.Replace(@"Stack", ".png");
。如果你打算最后匹配它,那么你可以使用"Stack$"
regex。
【参考方案1】:
根据 Yuri 和 Cid 的建议,您可以简单地做:
GridName.Replace("Stack",".png")
如果单词“Stack”在字符串中出现多次,这不是最佳选择,因为它将替换所有实例。因此,例如,"Stack01Stack"
将变为 ".png01.png"
。当你试图形成一个好的文件名时,你真的只想用“.png”替换最后一次出现的“Stack”,并且只有它位于字符串的末尾。因此,如果 Stack 出现多次,则按照 cmets 的建议使用“Stack\b”最终也会弄乱有效的文件名。例如,使用该正则表达式 "GridStack-01Stack"
将变为 "Grid.png-01.png"
这都是基于对这些字符串可能的推测,所以这个解决方案可能不是必需的,但我建议使用以下正则表达式,它只会在发生时更改单词 Stack在字符串的末尾:
string result = Regex.Replace(GridName, "Stack$", ".png");
【讨论】:
【参考方案2】:\bStack**\b** - 在单词前后查找带有空格、制表符、换行符等的整个单词 'Stack'。
您只需要 String.Replace 即可。
【讨论】:
【参考方案3】:• 字符串替换:string x = "Grid01Stack".Replace("Stack", ".png");
• 正则表达式:string x = Regex.Replace("Grid01Stack", "[Ss]tack$", ".png");
正则表达式将搜索始终位于字符串末尾的Stack
或stack
。
【讨论】:
以上是关于为啥这个正则表达式替换语句没有做任何事情? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
React - socket.io on() 似乎没有做任何事情