func(arg1, arg2)
,它将接受两个参数:第一个是字符串本身,第二个是要测试的正则表达式数组。我已阅读了一些解释(例如Regular Expressions: Is there an AND operator?),但它们没有回答这个具体问题。例如,在Javascript中,以下三个代码片段将返回
true
:/(?=ab)(?=abc)(?=abcd)/gi.test("eabzzzabcde");
/(?=.*ab)(?=.*abc)(?=.*abcd)/gi.test("eabzzzabcde");
/(?=.*?ab)(?=.*?abc)(?=.*?abcd)/gi.test("eabzzzabcde");
显然,这不是我想要的结果(因为在字符串"eabzzzabcde"
中,"abc"
和"abcd"
只是混在一起重叠了)。所以,func("eabzzzabcde", [/ab/gi, /abc/gi, /abcd/gi])
应该返回false
。
但是,func("Fhh, fabcw wxabcdy yz... zab.", [/ab/gi, /abc/gi, /abcd/gi])
应该返回true
,因为"ab"
、"abc"
和"abcd"
子字符串没有重叠。逻辑如下:我们有一个正则表达式数组:[/ab/gi, /abc/gi, /abcd/gi]
,以及原始字符串的三个(其中3等于该数组的长度)可能的非重叠、独立子字符串:fabcw
、xabcdy
和zab.
fabcw
是否与/abc/gi
匹配?是的。好的,我们从数组中删除/abc/gi
,对于xabcdy
和zab.
,我们得到[/ab/gi, /abcd/gi]
。 xabcdy
是否与/abcd/gi
匹配?是的。好的,我们从当前数组中删除/abcd/gi
,对于zab.
,我们得到[/ab/gi]
。 zab.
是否与/ab/gi
匹配?是的。在当前数组中没有更多的正则表达式了,并且我们始终回答“是”,所以返回true
。
这里的棘手之处在于找到一种有效(性能不太糟糕)的方法来获取至少一个可能的“好”的非重叠子字符串组合。
func("acdxbaab ababaacb", [/.*?a.*?b.*?c/gi, /.*?c.*?b.*?a/gi])
。根据上面描述的逻辑,我们可以看出,如果我们取原始字符串的两个不重叠部分"acdxba"
(或"cdxba"
)和"abaac"
(或"abaacb"
、"babaac"
等),第一个匹配/.*?c.*?b.*?a/gi
,而第二个匹配/.*?a.*?b.*?c/gi
。所以,func("acdxbaab ababaacb", [/.*?a.*?b.*?c/gi, /.*?c.*?b.*?a/gi])
应该返回true
。有没有更有效的方法来解决这样的问题?
.test()
只会给你一个是否匹配的是/否答案,但如果你使用.exec()
(或.match()
),你将得到匹配的详细信息以及它在字符串中的索引,因此你应该能够利用这些信息来检查重叠。关于你的例子"Fhh, fabcw wxabcdy yz... zab."
,这些子字符串确实彼此重叠,因为/ab/gi
将在该输入字符串中匹配三次。 - nnnnnnfunc("Fhh,fabcw wxabcdy yz... zab。",[/ab/gi, /abc/gi, /abcd/gi])
。我认为这应该返回false
而不是true
(因为在“wxabcdy”中全部重叠)。 - Makyen