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

假设我想在任何分隔符字符处拆分字符串,但不是转义字符,我通常可以使用负后视和 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) ,这些字符不会因反斜杠或换行符等特殊字符而分崩离析(人们也应该能够转义它们)?


元芳怎么了
浏览 181回答 2
2回答

素胚勾勒不出你

天真的解决方案在分隔符与分隔符相同的情况下,您可以在分隔符之后进行否定前瞻,在否定后看的基础上:/(?<!\\)\\(?!\\)/注意事项这种方法有很多问题,我不建议用正则表达式解决它,我特别不建议让分隔符和转义字符相同。随着,作为分隔符,在一场结束文字字符会愚弄正则表达式,比如,abc\\,def不会得到分裂。随着\作为分隔符和转义字符,你不能有空白字段:abc,,def将三个字段,包括空单,但abc\\def将只是一个字段。怎么样abc\\\def?\在第一个字段的末尾或第二个字段的开头是否有文字?无论哪种方式,我的正则表达式都不会分裂。如果您愿意在边界处字面上禁止使用转义字符,并且不允许使用空字段,那么当转义符和分隔符相同时,我的正则表达式将起作用,而在另一种情况下,您的正则表达式将起作用。否则,我会推荐一个不同的解决方案,从左到右解析字符串,在遇到转义符时解释转义符,并在看到未转义的分隔符时abc\\,def进行拆分,以便正确拆分。

冉冉说

解决方案是反转操作:我可以查找分隔字符序列,而不是查找分隔符。因此,在,分隔符的情况下,我会寻找:((\\,)|[^,])([^,]*?(\\,)?)*: 转义逗号或非逗号字符,后跟任意数量(可能为空)的非逗号组(不情愿,因此它不会捕获\转义符)后跟一个可选的转义逗号。let separator = ','; // get from sanitized inputseparator = separator === '\\' ? '\\\\' : separator;const groups = new RegExp(`((\\\\${separator})|[^${separator}])([^${separator}]*?(\\\\${separator})?)+`, 'g');let columns = line.match(groups);这既,适用\于分隔符,也适用于分隔符,不会分别拆分\,和拆分\\。该表达式中最难的部分是将所有的转义都弄对。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript