为了账号安全,请及时绑定邮箱和手机立即绑定

否定后视不匹配转义字符,在转义反斜杠上失败

否定后视不匹配转义字符,在转义反斜杠上失败

元芳怎么了 2021-09-04 17:18:40
假设我想在任何分隔符字符处拆分字符串,但不是转义字符,我通常可以使用负后视和 string.split(regex)。例如:const regex = /(?<!\\)\,/;'abc,def'.split(regex); 'abc\\,def'.split(regex); 在,in处拆分abc,def,但不在 in处拆分abc\,def。这可以!但是,如果分隔符本身是一个反斜杠,则负向后视似乎无法按预期工作:const regex = /(?<!\\)\\/;'abc\\def'.split(regex); 'abc\\\\def'.split(regex); \在abc\defAND 中的第一个分开abc\\def。我天真地以为否定的lookbehind 与\前面的a不匹配\。参见:https : //regex101.com/r/ozkZR1/1如何在任何非转义字符处实现 string.split(regex) ,这些字符不会因反斜杠或换行符等特殊字符而分崩离析(人们也应该能够转义它们)?
查看完整描述

2 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

天真的解决方案

在分隔符与分隔符相同的情况下,您可以在分隔符之后进行否定前瞻,在否定后看的基础上:

/(?<!\\)\\(?!\\)/

注意事项

这种方法有很多问题,我不建议用正则表达式解决它,我特别不建议让分隔符和转义字符相同。

  • 随着,作为分隔符,在一场结束文字字符会愚弄正则表达式,比如,abc\\,def不会得到分裂。

  • 随着\作为分隔符和转义字符,你不能有空白字段:abc,,def将三个字段,包括空单,但abc\\def将只是一个字段。

  • 怎么样abc\\\def\在第一个字段的末尾或第二个字段的开头是否有文字?无论哪种方式,我的正则表达式都不会分裂。

如果您愿意在边界处字面上禁止使用转义字符,并且不允许使用空字段,那么当转义符和分隔符相同时,我的正则表达式将起作用,而在另一种情况下,您的正则表达式将起作用。

否则,我会推荐一个不同的解决方案,从左到右解析字符串,在遇到转义符时解释转义符,并在看到未转义的分隔符时abc\\,def进行拆分,以便正确拆分。


查看完整回答
反对 回复 2021-09-04
?
冉冉说

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);

这既,适用\于分隔符,也适用于分隔符,不会分别拆分\,和拆分\\。


该表达式中最难的部分是将所有的转义都弄对。


查看完整回答
反对 回复 2021-09-04
  • 2 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信