在匹配集合Regex中的单词中跳过最后一个字符

时间:2014-07-09 11:03:56

标签: c# .net regex

我正在用下面的表达式匹配几个单词字符串。

    string pattern = "(?=.*\bgoods\b|\bitems\b|\bthings\b).*$;

    string matchWord1 = goods;
    string matchWord2 = items;
    string matchWord3 = things;

如果下面的表达式可以修改为跳过边界中每个单词结尾的最后一个字符,你还能指导吗? .i.e。

Desire matchWords具有相同的字符串模式:

    string matchWord1 = good;
    string matchWord2 = item;
    string matchWord3 = thing;

因此,正则表达式会忽略最后的复数 s ,并且仍会匹配复数字以上。

我尝试使用以下但不起作用。

    string pattern = "^(?=.*\bgoods?\b|\bitems?\b|\bthings?\b).*$;

    string pattern = "^(?=.*\b(?:good|item|thing)s?\b).*$";



    string input = @"\b(?:I|would|like|to|see|id|of|bought|things|items)\b";

    MatchCollection mat = Regex.Matches(pattern, input, RegexOptions.IgnoreCase);
    foreach (var item in mat)
    {
      Console.WriteLine(item.ToString());
    }

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果您希望使用正则表达式匹配进行验证,如果整个字符串是事物以单数或复数形式只在匹配时返回单数字,使用

string pattern = "^(good|item|thing)s?$";

但如果匹配的单词应以单数或复数形式返回,请使用

string pattern = "^((?:good|item|thing)s?)$";

如果想要在字符串中的任何地方找到单数或复数的3个单词中的至少一个,并且仅在匹配时返回单数字,请使用

string pattern = "\\b(good|item|thing)s?\\b";

如果找到的单词应以单数或复数形式返回,请使用

string pattern = "\\b((?:good|item|thing)s?)\\b";

您导致不使用正则表达式的主要错误是Perl正则表达式中的\b表示字边界

但是C#regular-string-literals中的转义字符是反斜杠字符,因此编译器在源代码中的\b的EXE中只存储字符b。现在很明显为什么你的正则表达式不匹配。

通过使用另一个反斜杠转义正则表达式的反斜杠并因此在源代码\\b中使用,编译器实际上将字符串\b写入EXE并且正则表达式有效。

将来记住这一点:C#源代码中正则表达式字符串中的每个反斜杠必须使用额外的反斜杠进行转义,除非您使用verbatim-string-literal定义,这对正则表达式更好。

上面的最后一个正则表达式字符串的逐字符串文字定义示例:

string pattern = @"\b((?:good|item|thing)s?)\b";