用于排除特定字符和单词的正则表达式 C#

Regular expression to exclude specific characters and words C#

提问人:Alyona 提问时间:11/7/2023 最后编辑:Alyona 更新时间:11/7/2023 访问量:77

问:

我正在尝试在 C# 中构建一个正则表达式以匹配除以下以外的所有单词/数字/字符:

  • &
  • ,
  • and(作为一个词)
  • AND(作为一个词)
  • And(作为一个词)

以下表达式可以完美地排除前两个字符 ( 和 ):&,

@"^[^&,]+$"

我正在尝试类似以下表达式来排除单词(and、AND、And),但无法使它既不能与字符分开工作,也不能一起工作:

"\b(?!and|AND|And\b)w+"

任何帮助将不胜感激!谢谢!

C# 正则表达式

评论

0赞 The fourth bird 11/7/2023
如果这应该是单独的“单词”,那么请参阅 regex101.com/r/p4azwn/1(?<!\S)(?!and|AND|And)[^\s&,]+(?!\S)

答:

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 不客气!我很高兴您找到了适合您需求的解决方案。如果您有更多问题或遇到任何其他问题,请随时联系我们。祝您的项目成功!