RegExp具有可变部分,并可以解决Firefox中的负面回溯问题

时间:2019-04-17 05:48:36

标签: javascript regex

在使用正则表达式时,我面临着严峻的挑战,非常感谢您可能提供的任何帮助或指导。

以下表达式可用于将自定义标签值<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前缀的标签。

\方法中工作的正则表达式如何转换为在splittest操作中工作,包括“负向后看法”以排除转义标签?似乎未捕获的部分仍在注册匹配项;但我不确定。

我需要测试用户选择的字符串是否存在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,则插入标签。

0 个答案:

没有答案