0

我们正在从某人制作的错误导出中导入一些文本,其中充满了问号字符,而双引号曾经是双引号。

我可以用正则表达式替换?"?例子:

?foo? => "foo"
?foo bar? => "foo bar"
foo? => foo?
4

4 回答 4

2

您可以使用正则表达式\?(.*)\?来匹配?标记之间的内容。

但是如果你这样做,在示例中a ?b? ?c? d它会导致a "b? ?c" d因为它匹配最长的 substring ?b? ?c?

要解决这个问题,您需要对正则表达式使用惰性匹配\?(.*?)\?,这将导致a "b" "c" d.

如果不能像中那样有两个问号a ?? b,那么应该是\?(.+?)\?。所以:

Regex.Replace(text, @"\?(.+?)\?", "\"$1\"");

意思是“在第一组中被识别的$1任何东西”,即被识别的任何东西.+?

编辑:更快的选择是:

Regex.Replace(text, @"\?([^\?]+)\?", "\"$1\"");

[^\?]意思是“除了\?”。

于 2013-04-01T15:36:44.653 回答
1

你的正则表达式应该是/^\?([^?]+)\?$/http ://refiddle.com/gmw

于 2013-04-01T15:35:16.573 回答
1

正则表达式

/\?\b(.+?)\b\?/g

应该这样做 - 匹配单词边界旁边的所有问号(需要转义) ,并且不要贪婪

于 2013-04-01T15:42:39.430 回答
-1

尝试

s/\?(.*)\?/$1

它抓住了“?”之间的字符。

于 2013-04-01T15:31:47.550 回答