猿问

正则表达式封装任何不匹配的部分

使用示例短语:

所有男人都喜欢小工具,但有些男人比其他人更喜欢小工具

该示例包含单词widgets的两种用法。我要做的是匹配外面的位。请注意,虽然 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;

}

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


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


UYOU
浏览 76回答 2
2回答

九州编程

您可以使用Regex.Split然后用您喜欢的任何标签包装结果数组/列表中的每个奇数元素:var s = "All men like widgets but some men like widgets more than others";var chunks = Regex.Split(s, @"(\s*\bwidgets\b\s*)");var result = string.Concat(chunks.Select((i, index) => index % 2 == 0 ? $"<b>{i}</b>" : i));Console.WriteLine(result);// => <b>All men like</b> widgets <b>but some men like</b> widgets <b>more than others</b>请参阅C# 演示。该(\s*\bwidgets\b\s*)模式匹配并捕获到第 1 组 0+ 个空格、整个单词widgets和 0+ 个空格。这些匹配项保留在结果数组中,因为它们已被捕获。每个奇数元素都是一个不匹配的子串。如果您不想用标签包装空白的不匹配项,请添加额外的!string.IsNullOrWhiteSpace(i)检查:var chunks = Regex.Split(s, @"(\s*\bwidgets\b\s*)");var result = string.Concat(&nbsp; &nbsp; chunks.Select((i, index) =>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; index % 2 == 0 && !string.IsNullOrWhiteSpace(i) ?&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $"<b>{i}</b>" : i));请参阅此 C# 演示。

长风秋雁

正如艾哈迈德建议你应该使用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){&nbsp; &nbsp; var matches = Regex.Split(input, splitText);&nbsp; &nbsp; StringBuilder output = new StringBuilder();&nbsp; &nbsp; foreach (string match in matches)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; output.Append("<b>");&nbsp; &nbsp; &nbsp; &nbsp; output.Append(match.Trim());&nbsp; &nbsp; &nbsp; &nbsp; output.Append("</b>");&nbsp; &nbsp; }&nbsp; &nbsp; return output.ToString();}
随时随地看视频慕课网APP
我要回答