首页 > 解决方案 > 正则表达式封装任何不匹配的部分

问题描述

使用示例短语:

所有男人都喜欢小部件,但有些男人比其他人更喜欢小部件

该示例包含单词widgets的两种用法。我想做的是匹配外面的位。请注意,虽然小部件是一个词,但我正在寻找一种也适用于多个词的正则表达式解决方案。

鉴于上述示例,输出将包含 3 个匹配项:

  1. 所有男人都喜欢
  2. 但有些男人喜欢
  3. 比别人多

到目前为止,我有以下仅部分有效的正则表达式:

@"(?!widgets\b)\b\w+"

限制是它不能处理多个单词短语 - 它还匹配每个否定词,而不是 /succeed 之前的整个单词串,所以“all”、“men”和“like”而不是“all men like” .

我有另一个解决方案,它涉及一个更简单的正则表达式和一些额外的 c# 代码斩波和更改,但这不是我满意的解决方案:

string EmboldenString(string text, string termToExclude)
{
    var pattern = $@" ?{termToExclude} ?";

    var tagStart = "<b>";
    var tagEnd = "</b>";

    var result = Regex.Replace($"{tagStart}{text}{tagEnd}", pattern, (match) =>
    {
        return $"{tagEnd}{match}{tagStart}";
    });

    var emptyTag = tagStart + tagEnd;

    if (result.StartsWith(emptyTag))
        result = result.TrimStart(emptyTag.ToCharArray());

    if (result.EndsWith(emptyTag))
        result = result.TrimEnd(emptyTag.ToCharArray());

    return result;
}

从上面的代码可以看出,目标是为所有不匹配的位添加标签。

任何人都可以帮助更好的正则表达式。

标签: c#regex

解决方案


正如艾哈迈德建议的那样,您应该使用Regex.Spilt()

这是您的用例的示例

var op = Regex.Split("All men like widgets but some men like widgets more than others", @"widgets");

输出

//All men like
//but some men like
//more than others

更新

您可以使用以下代码

string op = GetTagsAroud("All men like widgets but some men like widgets more than others", @"widgets");

方法

static string GetTagsAroud(string input, string splitText)
{
    var matches = Regex.Split(input, splitText);
    StringBuilder output = new StringBuilder();
    foreach (string match in matches)
    {
        output.Append("<b>");
        output.Append(match.Trim());
        output.Append("</b>");
    }
    return output.ToString();
}

推荐阅读