正则表达式匹配部分或全部单词

时间:2016-03-16 14:58:10

标签: c# regex

我试图找出一个正则表达式,它可以匹配整个单词或a(预定长度,例如前4个字符)单词的一部分。

例如,如果我尝试匹配单词between并且我的偏移设置为4,那么

  之间的关系

是匹配,但不是

  

在下注之间下注β12之间的测试

我在regex101中创建了一个示例,我正在尝试(没有运气)正向前瞻(?=)和非单词边界\B的组合。

我发现了一个类似的question,它在其接受的answer中提出了一个词。 根据我的理解,它会以某种方式覆盖匹配器,根据单词和偏移量运行所有可能的正则表达式。

我的代码必须用C#编写,所以我试图转换上述代码。 正如我所见Regex.Replace(我还假设Regex.Match)可以接受委托来覆盖默认功能,但我无法使其正常工作。

3 个答案:

答案 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;
    }

Demo

答案 2 :(得分:1)

您可以使用此正则表达式

\b(bet(?:[^\s]){1,4})\b

并动态替换bet4

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

相关问题