我已经将问题转换为模式匹配问题,并尝试使用RE来解决它。
已转换的问题:给定'0/1'字符串,例如s = '111100111111100111111001'
,请尝试找到恰好3匹配的子字符串:
a
'1'
,后跟任意数量的任意字符,然后连续2个'1's
,并且匹配的总大小至少为4。
以上要求可以编码为RE模式:'1.{1,}11'
。并且也接受反向模式:'11.{1,}1'
。此外,任何两个相邻匹配的间隔都应消耗尽可能少的字符。
全部翻译为以下代码:
> import re
> s = '111100111111100111111001'
> p = '.*?(1.{1,}11|11.{1,}1).*?(1.{1,}11|11.{1,}1).*?(1.{1,}11|11.{1,}1).*?'
> ret = re.match(p, s)
> ret.groups()
结果:
> ('1111001111111', '1111', '11001')
从这个意义上说,结果是好,但不是最佳:每次比赛的时间应尽可能保持平衡。
精确的结果应为:
(''1111001','1111111',11111001')
但是我如何使用RE施加此约束?
我只能想到这一点:
var input = '111100111111100111111001';
for (var i = input.length; i >= 4; i--) {
var matches = input.match(new RegExp('.{' + i + '}', 'g'));
var output = matches.filter(x => /^1.+1$/.test(x));
if (output.length === 3) {
console.log(output)
}
}
以
1
开始,以1
结束并且至少包含4个字符
因此,您的示例输入也应匹配。如您所见,有很多输出可以匹配。
1111111
^^^^
1111111
^^^^
1111111
^^^^
1111111
^^^^
1111111
^^^^^
1111111
^^^^^
1111111
^^^^^
1111111
^^^^^^
1111111
^^^^^^
1111111
^^^^^^^