C#:正则表达式不匹配一组单词

Posted

技术标签:

【中文标题】C#:正则表达式不匹配一组单词【英文标题】:C#: Regex to do NOT match to a group of words 【发布时间】:2012-12-18 05:46:50 【问题描述】:

我需要一个正则表达式来匹配不在一组单词中的单词。我用谷歌搜索和堆积问题,发现了一些建议。但它们都是关于匹配一组字符,而不是单词。所以我试着自己写一个正则表达式。但我找不到正确的正则表达式。这是我迄今为止尝试过的最后一个:

(?:(?!office|blog).)+

我的话是officearticle。我想要输入不在此组中的单词。你能帮帮我吗?

【问题讨论】:

【参考方案1】:

我认为你的正则表达式应该是这样的:

Regex r = new Regex(@"\b(?!office|blog|article)\w+\b");
MatchCollection words = r.Matches("The office is closed, please visit our blog");

foreach(Match word in words)

   string legalWord = word.Groups[0].Value;
   ...

这将返回“The”、“is”、“close”、“please”、“visit”和“our”。

【讨论】:

取决于 OP 解析的内容,这可能会变成一个大字符串。例如,它不应该将“officer”变成“r”,所以它可以调整为查看整个单词,但是“offices”呢? :) 如果忽略的单词数量很大或无论如何都是动态的,那么方法会有所不同 - 我会使用像 \b\w+\b 这样的正则表达式读取所有单词并使用 HashSet.【参考方案2】:

不清楚你的问题。因为你尝试使用 office|blog 的正则表达式模式,但在下一行你说你的话是 officearticle 。好的,我在这里尝试使用这 3 个词(office、blog、article)。根据需要使用它,

Pattern pattern = Pattern.compile("(\\w+|\\W)");
Matcher m = pattern.matcher("Now the office is closed,so i spend time with blog and article writing");
while (m.find())

    Pattern pattern1 = Pattern.compile("office|blog|article"); //change it as your need
    Matcher m1 = pattern1.matcher(m.group());

    if(m1.find())
    
        System.out.print(m.group().replace(m.group(),""));
    
    else
        System.out.print(m.group());

输出:

现在已经关门了,所以我花时间和写作

【讨论】:

【参考方案3】:

尝试自己解决这个问题。在这里找到我的答案:http://www.regextester.com/15

正则表达式:^((?!badword).)*$

什么意思:

^$:仅匹配整个搜索字符串(开始 (^) 和结束 ($))。 ()*:匹配 0 个或多个包含的内容。 (?!badword):向前看当前字符,确保“badword”整体不匹配。 .: 匹配任意单个字符。

重要的是,这一次只匹配一个字符,并且在匹配每个字符后,检查以确保“badword”不会立即跟随。

【讨论】:

以上是关于C#:正则表达式不匹配一组单词的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式。匹配整个单词

只有在字符串中找到一组数字时,C# 正则表达式才匹配

需要 c# 正则表达式将逗号列表中的任何单词与另一个字符串中的任何单词匹配

42 python中正则中的分组 正则中匹配字符串的起始和结尾以及单词边界

正则表达式:\B 匹配不是单词开头或结束的位置

如果正则表达式不包含特定单词,如何匹配它?