在使用正则表达式时,我面临着严峻的挑战,非常感谢您可能提供的任何帮助或指导。
以下表达式可用于将自定义标签值<1>
上的字符串拆分为{ {1}}和<57>
到</1>
,但排除了诸如</57>
或\<22>
之类的转义字符,其中T是纯文本字符串。
\</17>
现在,我想在字符串中搜索特定标签,打开或关闭类型。因此,array = T.split(/((?:[^<\\]+|\\+.?|<(?!\/?(?:[1-9]|[1-4]\d|5[0-7])>))+|<\/?(?:[1-9]|[1-4]\d|5[0-7])>)/).filter(Boolean);
是必需的,因为new RegExp
段需要用特定的整数值1到57的可变字符串替换。
我未尝试其他问题中的一些[1-9]|[1-4]\d|[5][0-7]
建议,以获得有效的正则表达式模式。两个是:
str.replace()
replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
幸运的是,为每个replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
添加一个额外的\
产生了一个有效的表达式。但是,以下内容始终返回true。
\
即使n为21,该字符串n = '22';
t = '((?:[^<\\\\]+|\\\\+.?|<(?!\\/?(?:' + n + ')>))+|<\\/?(?:' + n + ')>)';
r = new RegExp( t , 'g' );
console.log( r.test('test\\\<21>') );
仍应返回'test\\\<21>'
,因为它以false
为前缀;但即使n = 22,它也会返回\
,并且true
中的所有字符串都返回true。
我意识到这个正则表达式是两个模式的OR;右边的模式是有效标签,左边的是有效标签。标签被捕获,Universe减去标签未被捕获。
(test
|
(?:[^<\\\\]+|\\\\+.?|<(?!\\/?(?:' + n + ')>))+
)
也许就是问题所在。 @Revo给了我负面的回顾部分here,并描述了它的工作原理。 @Georg为我带来了积极的贡献here。
如果将<\\/?(?:' + n + ')>
更改为仅右手模式,则它可以按预期工作,但不会排除带有t
前缀的标签。
在\
方法中工作的正则表达式如何转换为在split
和test
操作中工作,包括“负向后看法”以排除转义标签?似乎未捕获的部分仍在注册匹配项;但我不确定。
我需要测试用户选择的字符串是否存在replace
或'<' + n + '>'
,而不是前缀为'</' + n + '>'
的转义版本。如果找到它,则将其替换为\
。如果找不到,则需要添加特定标签。加上我正在使用的标签。
感谢您考虑我的问题以及您可能提供的任何指导。
添加
尽管我没有找到有关如何调整正则表达式以排除前缀''
的特定问题的答案,但Mozilla Developer文档总体上显示了使用\
和函数作为参数的更好方法。因此,与其尝试从正则表达式中排除转义的标签,不如让它们匹配并在第一个字符为replace
的情况下返回匹配。下面的示例解决方案。
\
结果为let n = '22',
t = '\\\\?<\\/?(?:' + n + ')>',
r = new RegExp( t, 'g' ),
x, str = '<21>This is \\ > \\<21> a \\<22>test</22> of </21>';
x = str.replace( r, (match) => { return match.charAt(0) === '\\' ? match : ''; } );
console.log( 'x = ' + x );
。因此,转义的x = <21>This is \ > \<21> a \<22>test of </21>
保留下来,未转义的\<22>
被删除。我敢肯定,对那些知道的人来说很简单,但是对我来说却是新手。
这对替换操作很有用,但对于仅未转义的标签是否存在测试没有帮助。如果没有负面的回顾,我想可以先对仅转义的标签在字符串上运行替换,然后将其删除,然后对未转义的标签测试该结果。如果为true,则对原始字符串运行上面的替换示例;否则为false。如果为false,则插入标签。