我有一个输入字符串,比方说potato
。我在Visual Studio中有一个大项目。我正在尝试编写一个正则表达式来查找输入长度超过两个字符的子字符串。例如,pot
,ato
,tat
等
/([p,o,t,a]){2,10}/g
这会找到包含这些字母的2到10个字符之间的任何字符串,但不考虑订单。我希望有效地做到
/([potato]){2,10}/g
并让它只返回在提供的字符串中找到的子字符串。这甚至可能吗?
答案 0 :(得分:1)
对于给定的例子,这个正则表达式可以完成这项工作:
(((pota?|ota)t?|tat)o?|ato)
这会在嵌套的OR(|
)表达式中获取所有可能的3个字符的子字符串,并匹配'potato'的所有后续字符(如果它们存在)(可选)。
此表达式中有一个可重复的逻辑,因此可以从任何用户提供的搜索项动态构建它。
为了证明这一点,这里有一个实时JavaScript代码片段。它允许您输入搜索字符串和要搜索的文本。然后它输出正则表达式并应用它,突出显示匹配的文本部分。
将此翻译为支持正则表达式的任何其他语言将是直截了当的:
// Core function
function buildRegexFor(find) {
var regexStr = find.substr(0,3);
for (var i = 1; i < find.length - 2; i++) {
regexStr = '(' + regexStr + find.substr(i+2,1) + '?|' + find.substr(i,3) + ')';
}
return regexStr;
}
// Handle button click event
document.querySelector('button').onclick = function () {
// (1) read input
var find = document.querySelector('input').value;
var str = document.querySelector('textarea').value;
// (2) build regular expression using above function
var regexStr = buildRegexFor(find);
// (3) apply regular expression to text and highlight all found instances
str = str.replace(new RegExp(regexStr, 'g'), "<b>$1</b>");
// (4) output
document.querySelector('span').textContent = regexStr;
document.querySelector('div').innerHTML = str;
};
b { background: yellow }
Value to find:<br>
<input value="potato"><br>
<button>find</button><br>
Text to find in:<br>
<textarea cols=40>There is a spot in the botanic garden
on this atol that beats all stats as it rotates potatoes.</textarea><br>
Regex: <span></span><br>
<div></div>
答案 1 :(得分:0)
您可以以编程方式生成字符串(以Python为例):
s = "potato"
min_length = 3
substrings = set()
for x in range(len(s)):
for y in range(x + min_length, len(s)):
substrings.add(s[x:y])
pattern = "(" + "|".join(substrings) + ")"
print(pattern)