【发布时间】:2019-04-22 11:55:47
【问题描述】:
使用示例短语:
所有男人都喜欢widgets,但有些男人比其他人更喜欢widgets
该示例包含单词 widgets 的两种用法。我想做的是匹配外面的位。请注意,虽然小部件是一个词,但我正在寻找一种也适用于多个词的正则表达式解决方案。
鉴于上述示例,输出将包含 3 个匹配项:
- 男人都喜欢
- 但有些男人喜欢
- 比别人多
到目前为止,我有以下仅部分有效的正则表达式:
@"(?!widgets\b)\b\w+"
限制是它不能处理多个单词短语 - 它还匹配每个否定词,而不是 /succeed 之前的整个词串,所以“all”、“men”和“like”而不是“all男人喜欢”。
我有另一个解决方案,它涉及一个更简单的正则表达式和一些额外的 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.Split()。例如,\b(?:widgets|foo|bar)\b. -
在上面的代码中,我在匹配项周围添加了 标记,但返回了整个字符串 - 如果我使用 Regex.Split,怎么可能做到这一点?