Regexp所以反斜杠意味着删除下一个字符'

时间:2017-07-21 13:28:46

标签: regex pcre

我需要一个正则表达式来执行以下转换:

Input:  ab\xy
Output: aby


Input: ab\\xy
Output: ab\xy

将所有这些反斜杠视为LITERAL反斜杠。也就是说,第一个输入是字符序列['a', 'b', '\', 'x', 'y'],第二个输入是['a', 'b', '\', '\', 'x', 'y']

规则是"在一串字符中,如果遇到反斜杠,删除它和后面的字符...除非后面的字符是反斜杠,在这种情况下只删除两个反斜杠中的一个。 "

这是逃脱序列的地狱,我似乎无法找到出路。

1 个答案:

答案 0 :(得分:1)

您可以使用

(?s)\\(\\)|\\.

并替换为$1以在找到双反斜杠时恢复\

<强>详情:

  • (?s) - 一个dotall修饰符,以便.可以匹配任何包含换行符的字符
    • \\(\\) - 匹配反斜杠,然后匹配并捕获另一个反斜杠到第1组
  • | - 或
  • \\. - 匹配任何转义序列(反斜杠+任何字符)。

请参阅regex demoPHP demo

$re = '/\\\\(\\\\)|\\\\./s';
$str = 'ab\\xy ab\\\\xy ab\\\\\\xy';
echo $result = preg_replace($re, '$1', $str);
// => aby ab\xy ab\y