我试图找出一个正则表达式,它可以匹配整个单词或a(预定长度,例如前4个字符)单词的一部分。
例如,如果我尝试匹配单词between
并且我的偏移设置为4
,那么
之间的关系
是匹配,但不是
在下注之间下注β12之间的测试
我在regex101中创建了一个示例,我正在尝试(没有运气)正向前瞻(?=)
和非单词边界\B
的组合。
我发现了一个类似的question,它在其接受的answer中提出了一个词。 根据我的理解,它会以某种方式覆盖匹配器,根据单词和偏移量运行所有可能的正则表达式。
我的代码必须用C#编写,所以我试图转换上述代码。 正如我所见,但我无法使其正常工作。Regex.Replace
(我还假设Regex.Match
)可以接受委托来覆盖默认功能
答案 0 :(得分:2)
您可以选择前4个字符,并将其余字符设为可选字段 然后将它们包装在单词边界和括号中。
因此,在""之间,它将是
@"\b(betw)(?:(e|ee|een)?)\b"
实现这一目标的代码是:
public string createRegex(string word, int count)
{
var mandatory = word.Substring(0, count);
var optional = "(" + String.Join("|", Enumerable.Range(1, count - 1).Select(i => word.Substring(count, i))) + ")?";
var regex = @"\b(" + mandatory + ")(?:" + optional + @")\b";
return regex;
}
答案 1 :(得分:1)
您提到的答案中的代码只是构建了这个:
betw|betwe|betwee|between
所以你需要的只是编写一个函数,用最小长度建立一个给定单词子串的字符串。
static String BuildRegex(String word, int min_len)
{
String toReturn = "";
for(int i = 0; i < word.Length - min_len +1; i++)
{
toReturn += word.Substring(0, min_len+i);
toReturn += "|";
}
toReturn = toReturn.Substring(0, toReturn.Length-1);
return toReturn;
}
答案 2 :(得分:1)
您可以使用此正则表达式
\b(bet(?:[^\s]){1,4})\b
并动态替换bet
和4
:
public static string CreateRegex(string word, int minLen)
{
string token = word.Substring(0, minLen - 1);
string pattern = @"\b(" + token + @"(?:[^\s]){1," + minLen + @"})\b";
return pattern;
}
这是一个演示:https://regex101.com/r/lH0oL2/1
编辑:对于bet1122
匹配,您可以通过以下方式编辑模式:
\b(bet(?:[^\s0-9]){1,4})\b
如果您不想匹配某些字符,只需将它们排入[]字符类即可。
演示:https://regex101.com/r/lH0oL2/2
有关详细信息,请参阅http://www.regular-expressions.info/charclass.html