为啥这个正则表达式替换语句没有做任何事情? [复制]

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);
    

【问题讨论】:

第一个单词边界\b1S之间不匹配 1S 之间没有单词边界。 1S 都是单词字符。 \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"); 正则表达式将搜索始终位于字符串末尾的Stackstack

【讨论】:

以上是关于为啥这个正则表达式替换语句没有做任何事情? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的模拟鼠标点击没有做任何事情?

为啥json没有做任何事情?

为啥 .catch() 没有做任何事情?

React - socket.io on() 似乎没有做任何事情

React Native WebView onMessage 没有做任何事情

RemoteNotifications 没有注册/没有做任何事情