我需要一个正则表达式来执行以下转换:
Input: ab\xy
Output: aby
Input: ab\\xy
Output: ab\xy
将所有这些反斜杠视为LITERAL反斜杠。也就是说,第一个输入是字符序列['a', 'b', '\', 'x', 'y']
,第二个输入是['a', 'b', '\', '\', 'x', 'y']
。
规则是"在一串字符中,如果遇到反斜杠,删除它和后面的字符...除非后面的字符是反斜杠,在这种情况下只删除两个反斜杠中的一个。 "
这是逃脱序列的地狱,我似乎无法找到出路。
答案 0 :(得分:1)
您可以使用
(?s)\\(\\)|\\.
并替换为$1
以在找到双反斜杠时恢复\
。
<强>详情:
(?s)
- 一个dotall修饰符,以便.
可以匹配任何包含换行符的字符
\\(\\)
- 匹配反斜杠,然后匹配并捕获另一个反斜杠到第1组|
- 或\\.
- 匹配任何转义序列(反斜杠+任何字符)。请参阅regex demo和PHP demo:
$re = '/\\\\(\\\\)|\\\\./s';
$str = 'ab\\xy ab\\\\xy ab\\\\\\xy';
echo $result = preg_replace($re, '$1', $str);
// => aby ab\xy ab\y