来求个用于转义字符串的正则表达式

2015-02-24 17:00:04 +08:00
 qq529633582
需求:(为方便表达,下面引号内字符串本身不作转义,即"\\"代表的就是两个斜杠)
对于一系列的("abc", "xyz"),"\abc"是"xyz"的转义,要实现“\abc” -> "xyz"而"\\abc" -> "\abc"的变换。

0. Google it
Google给我提供了一堆正则表达式应当如何转义的资料

1. Attempt Round 0
replace("\abc", "xyz"); replace("\\", "\");
这使得"\\abc" -> "\xyz",失败

2. Attempt Round 1
replace(/(?<!\\)((\\*)\2)\\abc/g, "$1xyz"); replace("\\", "\");
什么?JavaScript不支持"(?<!)"?

3. Attempt Round 2
replace("(?:[^\\]|^)((\\*)\2)\\abc"/mg, "$1xyz"); replace("\\", "\");
看上去不错。仔细一看转义内容前面的那个字被吃掉了,~~(>_<)~~

4. 上v2ex提问
进行中……
2025 次点击
所在节点    正则表达式
11 条回复
mhycy
2015-02-24 17:04:25 +08:00
你是做一个字典替换操作么?
MaiCong
2015-02-24 17:05:42 +08:00
先转义\\再转义\
qq529633582
2015-02-24 17:05:58 +08:00
@mhycy 是的
字典是[("abc", "xyz"), ...]
qq529633582
2015-02-24 17:06:33 +08:00
@MaiCong 这会导致"\\abc" -> "\abc" -> "xyz"
mhycy
2015-02-24 17:07:36 +08:00
@qq529633582
同意二楼 @MaiCong
mhycy
2015-02-24 17:15:50 +08:00
@qq529633582
第一次字典替换使用正则提取出所有\\abc 标记位置,第二次提取\abc标记位置,求差集,替换,最后处理\\
qq529633582
2015-02-24 17:17:00 +08:00
@mhycy 一定要这样吗?有没有优雅些的实现方式呢?
sumhat
2015-02-24 17:17:29 +08:00
replace(/([^\\]|^)\\abc/g, '$1xyz').replace(/\\\\abc/g, '\\abc');

这样不行?
mhycy
2015-02-24 17:19:44 +08:00
@qq529633582 也许能用正则,电脑不在手边没法测试。。囧
qq529633582
2015-02-24 17:22:51 +08:00
@sumhat 对哦,我为什么要把第一个组忽略掉……
lk09364
2015-02-24 17:48:54 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/172503

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX