用百分号将单引号内的字符串括起来

Bracket a string that's inside single quotes with percentage sign

直到 4 年前,我对正则表达式了如指掌,但从那以后我就再也没有接触过它们,所以我需要一些帮助。

我如何编写一个正则表达式来将所有出现的 'whatever' 替换为 '%whatever%',包括单引号?

我希望按照以下指定的方式转换以下字符串:

Original                    Convert To
hello 'world'               hello '%world%'
'foo' bar                   '%foo%' bar
'foo bar'                   '%foo bar%'
foo 'bar' but gar 'har'     foo '%bar%' but gar '%har%'

请特别注意。最后一个例子。我想要 lazy 匹配和 not greedy 匹配。最后一种情况下的贪婪匹配会将原始字符串替换为值 foo'%..%'`

我正在使用 C#。第一个离我最近的是:

Regex.Replace(s, "[Hh][Ee][Ll]{2}[Oo] '.*'", "[Hh][Ee][Ll]{2}[Oo] '%.*%'");

但这显然是不正确的。我不知道如何取回单引号中的内容。

更新: 谢谢大家的答案。他们都非常乐于助人。我记得现在正在看你的答案。我缺少的是一个 字符实体引用 或者它被称为你可以引用所有以前的模式匹配的东西。

搜索 '([^']+)' 并替换为 '%%'

您可以像这样使用简单的正则表达式:

(')([^']+)

并使用替换字符串:

%%

您可以使用以下正则表达式进行替换。

String r = Regex.Replace(s, @"'([^']*)'", "'%%'");

Ideone Demo

以下正则表达式如何:

var res = Regex.Replace(s, @"'(.*?)'", "'%%'");

由于单引号内的字符以单词字符开头和结尾,您可以使用以下基于环视的正则表达式。

String r = Regex.Replace(s, @"(?<=')\b|\b(?=')", "%");

DEMO