<1>
转义为<57>
,将</1>
转义为</57>
。在Georg的这里帮助下,在尝试转义之前,以下表达式生成了所需的结果。
('This is a <21>test</21> again.').split(/(<\/?(?:[1-9]|[1-4][0-9]|5[0-7])>)/);
生成 'This is a ', '<21>', 'test', '</21>', ' again.'
。
这个问题有一个建议,使用负向预查和OR来近似不支持的负向回顾。我修改了那个例子,以解决我认为更简单的问题;然而,我又被卡住了。
('This is a <21>test</21> again.').split(/(?:(?!\\).|^)(<\/?(?:[1-9]|[1-4][0-9]|5[0-7])>)/) );
生成'This is a','<21>','tes','</21>',' again.'
因此,它不包括前一个字符<21>
或</21>
,当不是\
时。我知道为什么会这样,因为使用了非捕获的?:
。
但是,如果删除它:
('This is a <21>test</21> again.').split(/((?!\\).|^)(<\/?(?:[1-9]|[1-4][0-9]|5[0-7])>)/) );
生成 'This is a', ' ', '<21>', 'tes', 't', '</21>', ' again.'
,并且前一个字符生成了一个单独的分割。
除了这个问题,转义的工作方式是,当前一个字符是 \
时,标签不会生成字符串的分割。
请问是否有一种方法可以捕获前一个字符,但将其包含在前一个字符串的文本中而不是其自己的分割中?并且可能仅在存在 \
时排除它?
当字符串为 'This is a <21>test</21> again.'
时,期望的结果是 'This is a ', '<21>', 'test', '</21>', ' again.'
当它是'This is a \<21>test</21> again.'
时,期望的结果是'This is a <21>', 'test', '</21>', ' again.'
谢谢。
加法 最近,在thisMDN文档中了解到使用内联函数作为正则表达式replace
操作的参数后,我开始想知道是否可以在这里做类似的事情。我不知道如何衡量性能,但Revo提供的正则表达式的复杂性以及他对我的效率评论的负面影响表示,否定向后看将是效率显著提高和减少RegExp引擎工作量的方法,而RegExp在幕后是一个黑盒子,这促使我尝试另一种方法。它是几行代码,但产生相同的结果并使用更短的正则表达式。它真正做的就是匹配标记,包括有和没有转义字符的标记,而不是尝试排除那些带有\
转义的标记,然后忽略构建数组中具有转义字符的标记。下面是片段。我不知道控制台日志中提供的时间是否代表性能,但如果是这样,在我运行的示例中,似乎在记录“start”和“a.split”之间的时间差作为百分比的差异要比在“exec”方法下记录数组“a”的最终日志之间的时间差异大得多。
另外,在while语句内部最内层的if块用于防止在字符串开头或结尾处有标记,或者两个标记之间没有空格时将""保存在数组中。
我很感激您能提供关于为什么或为什么不使用一种方法的任何见解,或者介绍一种更好的方法来处理无法访问真正的负向查找的情况。谢谢。
let a, i = 0, l, p, r,
x = /\\?<\/?(?:[1-9]|[1-4]\d|5[0-7])>/g,
T = '<1>This is a <21>test<21> of \\<22>escaped and \\> </ unescaped tags.<5>';
console.log('start');
a = T.split(/((?:[^<\\]+|\\+.?|<(?!\/?(?:[1-9]|[1-4]\d|5[0-7])>))+|<\/?(?:[1-9]|[1-4]\d|5[0-7])>)/).filter(Boolean);
console.log(a);
a=[];
while ( ( r = x.exec( T ) ) !== null) {
if ( r[0].charAt(0) !== '\\' )
{
if ( r.index === 0 || r.index === p )
{
a[ i ] = r[0];
i = i + 1;
}
else
{
a[ i ] = T.substring( p, r.index );
a[ i + 1 ] = r[0];
i = i + 2;
}; // end if
p = x.lastIndex;
}; // end if
}; // next while
if ( p !== T.length ) a[i] = T.substring( p );
console.log(a)