c# - 正则表达式封装任何不匹配的部分
问题描述
使用示例短语:
所有男人都喜欢小部件,但有些男人比其他人更喜欢小部件
该示例包含单词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;
}
从上面的代码可以看出,目标是为所有不匹配的位添加标签。
任何人都可以帮助更好的正则表达式。
解决方案
正如艾哈迈德建议的那样,您应该使用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();
}
推荐阅读
- javascript - MVC 中的用户代码未处理 HTTP 异常
- python - Keras损失函数理解
- javascript - 'click' 事件仅在第一次点击时触发,而不是在第二次点击时触发
- reactjs - 如何在 GraphQL 查询中使用变量?
- android - 改造 - 在序列化期间动态添加字段
- arrays - 从数组中删除对象
- java - Java Streams Api,有限流
- sql-server - 我可以授予登录对象的数据库权限吗?
- hyperledger-fabric - 本地 MSP 初始化失败:admin 0 无效:无法获取证书链
- python-3.x - Python Docx 表格行高