提问人:Alyona 提问时间:11/7/2023 最后编辑:Alyona 更新时间:11/7/2023 访问量:77
用于排除特定字符和单词的正则表达式 C#
Regular expression to exclude specific characters and words C#
问:
我正在尝试在 C# 中构建一个正则表达式以匹配除以下以外的所有单词/数字/字符:
&
,
and
(作为一个词)AND
(作为一个词)And
(作为一个词)
以下表达式可以完美地排除前两个字符 ( 和 ):&
,
@"^[^&,]+$"
我正在尝试类似以下表达式来排除单词(and、AND、And),但无法使它既不能与字符分开工作,也不能一起工作:
"\b(?!and|AND|And\b)w+"
任何帮助将不胜感激!谢谢!
答:
3赞
Mathias R. Jessen
11/7/2023
#1
锚定您的模式,将边界移动到前瞻中,然后替换为要排除的边界,并:w+
,
&
var pattern = @"^(?!.*\b(and|And|AND)\b)[^&,]+$";
lookadhead 部分前面的 确保引擎尝试耗尽整个输入字符串以满足断言,而不仅仅是查看输入的开头。.*
\b(and|And|AND)\b
评论
0赞
Mathias R. Jessen
11/7/2023
@Alyona 不客气。请注意,这(锚定可变长度断言中的断言)在长输入字符串上可能具有糟糕的性能特征 - 如果可能的话,您可能只想将其拆分为 2 个单独的搜索操作
0赞
Alyona
11/7/2023
我明白了,谢谢你让我知道!我现在将它用于短字符串,所以我认为原始解决方案会起作用:)
0赞
Paul Breakthrough
11/7/2023
#2
您可以通过在正则表达式中使用否定前瞻断言来实现此目的。下面是一个正则表达式模式,它应匹配除“&”之外的所有单词、数字和字符,以及单词“and”、“AND”和“And”作为整个单词:
string input = "Your input string here";
string pattern = @"(?i)\b(?![&,]|and)\w+\b";
MatchCollection matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
解释:
(?i)
在开始时,使正则表达式不区分大小写。\b
断言单词边界。(?![&,]|and)
是一个否定的前瞻性断言。它确保后面的内容在任何情况下都不是“&”或“和”一词。\w+
匹配一个或多个单词字符。- 最后一个断言另一个单词边界,以确保我们匹配整个单词。
\b
此正则表达式模式应成功匹配单词、数字和字符,同时排除指定的字符和单词。
评论
0赞
Alyona
11/7/2023
谢谢你如此彻底的回应,保罗!我尝试使用我的模型中建议的模式,但由于某种原因,它似乎没有捕获无效的字符/单词。上面Mathias建议的答案对我有用,所以我现在将采用这种模式。再次感谢您的帮助!
0赞
Paul Breakthrough
11/7/2023
@Alyona 不客气!我很高兴您找到了适合您需求的解决方案。如果您有更多问题或遇到任何其他问题,请随时联系我们。祝您的项目成功!
评论
(?<!\S)(?!and|AND|And)[^\s&,]+(?!\S)