我有一个字符串 - > ' abcabcabclslslsokjokjokj' 我需要找到一种能够识别所有重现的算法(或至少一个最长的唯一)
我发现(\w+?)\1+
(适用于Ruby的作品)它的效果就像单次重现的魅力一样。
'abcabcabcabc' #=> 'abc'
但'ababcababcababcababcababcababc'
失败,预期结果为ababc
,但结果为ab
我错在哪里,找到正确的方法是什么: -
ababcababcababcjkjkjkjk
=> ababc
)
2(奖金)。字符串中的所有唯一非重叠循环重复(ababcababcababcabhabhabhlklklk
=> ababc
,abh
,lk
)答案 0 :(得分:1)
Use this regex查找字符串中所有重复的子模式。
(?=(\w+)\1)
然后,您需要一些额外的代码来检查所有匹配的子组是否为最长的。
<强>解释强>
不仅仅需要一个简单的正则表达式,因为遇到的第一个重复模式将会吞噬&#34;吞噬&#34;匹配的字符串部分。并且该部分字符串不能再用于其他潜在的匹配。考虑这个例子:
abcabccabc
最长的重复模式是cabc
,但是像(\w+)\1
这样的简单正则表达式找不到这个模式,因为它会与abcabc
匹配,然后不再查看该部分字符串。
正向前瞻(?=...)
,在匹配时不使用字符串,用于查找最长的潜在重复模式,并将其存储在捕获组中。这将从字符串中的每个字符开始检查。
答案 1 :(得分:0)
这是没有正则表达式(Regex)的javascript问题的解决方案
ACCESS HEALTH CT
Connecticut All Payers Claims Database
DATA SUBMISSION GUIDE
December 5, 2013
Version 1.2 (with clarifications)
const longestString = str => {
obj = {};
longest = [];
current = [];
for (let i=0; i<str.length; i++) {
if (obj[str[i]] === undefined) {
obj[str[i]] = 1;
current.push(str[i]);
} else {
if (current.length > longest.length) {
longest = [...current];
current = [];
obj = {};
obj[str[i]] = 1;
current.push(str[i]);
}
}
}
return longest.join('');
}
console.log(longestString('ababcababcababcababcababcababc'));