为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
UYOU 2022-12-24 12:43:32
使用示例短语:所有男人都喜欢小工具,但有些男人比其他人更喜欢小工具该示例包含单词widgets的两种用法。我要做的是匹配外面的位。请注意,虽然 widgets 是一个词,但我正在寻找一种也适用于多个词的正则表达式解决方案。给定上述示例,输出将包含 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;}从上面的代码可以看出,目标是为所有不匹配的位添加标签。任何人都可以提供更好的正则表达式帮助。
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

您可以使用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(

    chunks.Select((i, index) => 

        index % 2 == 0 && !string.IsNullOrWhiteSpace(i) ? 

            $"<b>{i}</b>" : i));

请参阅此 C# 演示



查看完整回答
反对 回复 2022-12-24
?
长风秋雁

TA贡献1757条经验 获得超7个赞

正如艾哈迈德建议你应该使用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();

}


查看完整回答
反对 回复 2022-12-24
  • 2 回答
  • 0 关注
  • 74 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信