代替:
(\'[^\']*\'|"[^"]*")
简单地写:
\'([^\']*)\'|"([^"]*)"
\______/ \_____/
1 2
现在其中一组将匹配引用的内容。
在大多数风格中,当在替换字符串中引用无法匹配的组时,空字符串将被替换,因此您可以简单地替换为$1$2
一个将成功捕获(取决于替代方案),另一个将替换为空字符串。
这是一个 PHP 实现(如 ideone.com 上所示 http://ideone.com/jKMNZ):
$text = <<<EOT
"hello", how 'are "you" today'
EOT;
print preg_replace(
'/\'([^\']*)\'|"([^"]*)"/',
'$1$2',
$text
);
# hello, how are "you" today
仔细看看
让我们使用1
and 2
引用(为了清楚起见)。还将添加空格(为了清晰起见)。
之前,作为第二个解决方案,您有以下模式:
( 1[^1]*1 | 2[^2]*2 )
\_______________________/
capture whole thing
content and quotes
正如您正确指出的那样,这正确匹配了一对引号(假设您无法转义引号),但它没有捕获content part.
根据上下文,这可能不是一个问题(例如,您可以简单地从开头和结尾修剪一个字符来获取内容),但同时,解决问题也不难:只需从分别有两种可能性。
1([^1]*)1 | 2([^2]*)2
\_____/ \_____/
capture contents from
each alternate separately
现在,组 1 或组 2 将捕获内容,具体取决于匹配的替代项。作为“奖励”,您可以检查使用了哪个报价,即如果第 1 组成功,则1
被使用了。
Appendix
The […]
is a 字符类 http://www.regular-expressions.info/charclass.html。就像是[aeiou]
匹配任意小写元音之一。[^…]
is a negated字符类。[^aeiou]
匹配其中之一除了小写元音。
(…)
是用来grouping http://www.regular-expressions.info/brackets.html. (pattern)
是一个捕获组并创建反向引用。(?:pattern)
是非捕获的。
参考
-
用于捕获的正则表达式.info/括号 http://www.regular-expressions.info/brackets.html, 交替 http://www.regular-expressions.info/alternation.html, 字符类 http://www.regular-expressions.info/charclass.html, 重复 http://www.regular-expressions.info/repeat.html