我们正在从一个错误的导出中导入一些文本,它充满了问号字符,而双引号曾经是。有没有一个正则表达式替换可以用"替换??示例:
"
?
?foo? => "foo" ?foo bar? => "foo bar" foo? => foo?
8hhllhi21#
您可以使用正则表达式\?(.*)\?来匹配?标记之间的内容。但是如果你这样做,在a ?b? ?c? d的例子中,它会得到a "b? ?c" d,因为它匹配最长的子串?b? ?c?。要解决这个问题,您需要使用正则表达式\?(.*?)\?的延迟匹配,这将导致a "b" "c" d。如果不能像a ?? b那样有两个问号,那么应该是\?(.+?)\?。所以:
\?(.*)\?
a ?b? ?c? d
a "b? ?c" d
?b? ?c?
\?(.*?)\?
a "b" "c" d
a ?? b
\?(.+?)\?
Regex.Replace(text, @"\?(.+?)\?", "\"$1\"");
$1表示“第一组中识别的任何内容”,即.+?识别的任何内容。
$1
.+?
**编辑:**更快的替代方法是:
Regex.Replace(text, @"\?([^\?]+)\?", "\"$1\"");
[^\?]的意思是“除了\?以外的任何东西”。
[^\?]
\?
ckx4rj1h2#
正则表达式
/\?\b(.+?)\b\?/g
应该这样做-匹配word boundaries旁边的所有问号(need to be escaped),并且不贪心。
6mw9ycah3#
正则表达式应为/^\?([^?]+)\?$/
/^\?([^?]+)\?$/
k97glaaz4#
试试看
s/\?(.*)\?/$1
它会把字符夹在中间“?“
4条答案
按热度按时间8hhllhi21#
您可以使用正则表达式
\?(.*)\?
来匹配?
标记之间的内容。但是如果你这样做,在
a ?b? ?c? d
的例子中,它会得到a "b? ?c" d
,因为它匹配最长的子串?b? ?c?
。要解决这个问题,您需要使用正则表达式
\?(.*?)\?
的延迟匹配,这将导致a "b" "c" d
。如果不能像
a ?? b
那样有两个问号,那么应该是\?(.+?)\?
。所以:$1
表示“第一组中识别的任何内容”,即.+?
识别的任何内容。**编辑:**更快的替代方法是:
[^\?]
的意思是“除了\?
以外的任何东西”。ckx4rj1h2#
正则表达式
应该这样做-匹配word boundaries旁边的所有问号(need to be escaped),并且不贪心。
6mw9ycah3#
正则表达式应为
/^\?([^?]+)\?$/
k97glaaz4#
试试看
它会把字符夹在中间“?“