2 回答
![?](http://img1.sycdn.imooc.com/5333a1bc00014e8302000200-100-100.jpg)
TA贡献1827条经验 获得超9个赞
天真的解决方案
在分隔符与分隔符相同的情况下,您可以在分隔符之后进行否定前瞻,在否定后看的基础上:
/(?<!\\)\\(?!\\)/
注意事项
这种方法有很多问题,我不建议用正则表达式解决它,我特别不建议让分隔符和转义字符相同。
随着
,
作为分隔符,在一场结束文字字符会愚弄正则表达式,比如,abc\\,def
不会得到分裂。随着
\
作为分隔符和转义字符,你不能有空白字段:abc,,def
将三个字段,包括空单,但abc\\def
将只是一个字段。怎么样
abc\\\def
?\
在第一个字段的末尾或第二个字段的开头是否有文字?无论哪种方式,我的正则表达式都不会分裂。
如果您愿意在边界处字面上禁止使用转义字符,并且不允许使用空字段,那么当转义符和分隔符相同时,我的正则表达式将起作用,而在另一种情况下,您的正则表达式将起作用。
否则,我会推荐一个不同的解决方案,从左到右解析字符串,在遇到转义符时解释转义符,并在看到未转义的分隔符时abc\\,def
进行拆分,以便正确拆分。
![?](http://img1.sycdn.imooc.com/54584e1f0001bec502200220-100-100.jpg)
TA贡献1877条经验 获得超1个赞
解决方案是反转操作:
我可以查找分隔字符序列,而不是查找分隔符。因此,在,分隔符的情况下,我会寻找:((\\,)|[^,])([^,]*?(\\,)?)*: 转义逗号或非逗号字符,后跟任意数量(可能为空)的非逗号组(不情愿,因此它不会捕获\转义符)后跟一个可选的转义逗号。
let separator = ','; // get from sanitized input
separator = separator === '\\' ? '\\\\' : separator;
const groups = new RegExp(`((\\\\${separator})|[^${separator}])([^${separator}]*?(\\\\${separator})?)+`, 'g');
let columns = line.match(groups);
这既,适用\于分隔符,也适用于分隔符,不会分别拆分\,和拆分\\。
该表达式中最难的部分是将所有的转义都弄对。
添加回答
举报