正则表达式中的问题

时间:2011-06-24 06:52:49

标签: c# .net regex

我有一个正则表达式

 Regex r = new Regex(@"(\s*)([A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|Y|X]\d(?!.*[DFIOQU])(?:[A-Z](\s?)\d[A-Z]\d))(\s*)",RegexOptions.IgnoreCase);

并且有一个字符串

string test="LJHLJHL HJGJKDGKJ JGJK  C1C 1C1 LKJLKJ";

我必须取C1C 1C1。这样运行正常。 但是如果修改测试字符串为

string test="LJHLJHL HJGJKDGKJ JGJK  C1C 1C1 ON";
然后它无法找到模式,即C1C 1C1。 知道为什么这个表达式失败了吗?

3 个答案:

答案 0 :(得分:3)

你有一个消极的期待:

(?!.*[DFIOQU])

匹配“ON”中的“O”,因为它是一个负面的前瞻,整个模式失败。而且,顺便说一句,我认为你想要取代它:

[A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|Y|X]

有了这个:

[A-CEGHJ-NPR-TVYX]

管道(|)是字符类中的文字字符,而不是替换字符,您可以使用范围来帮助显示您要忽略的字符。

单个正则表达式可能不是解析该字符串的最佳方法。或许你只需要一个更宽松的正则表达式。

答案 1 :(得分:1)

您正在寻找一个不是DFIOQU的关注您的负面展望(?!.*[DFIOQU])

在您的第二个字符串中,O末尾有一个ON,因此必须无法匹配。

如果你在前面的负面展示中移除.*,它只会检查直接跟随的字符而不是结尾的完整字符串(这是你想要的吗?)。

\s*([ABCEGHJKLMNPRSTVYX]\d(?![DFIOQU])(?:[A-Z]\s?\d[A-Z]\d))\s*

然后它可以工作,看到它here on Regexr。现在正在检查数字后面是否有一个字符,我不知道这是不是意图。

顺便说一下。我从第一个字符类中删除了|,不需要它,还有一些括号围绕你的空格,也不需要。

答案 2 :(得分:1)

据我了解,您需要在字符串中找到C1C 1C1文本 我用这个正则表达式做了这个

string strRegex = @"^.*(?<c1c>C1C)\s*(?<c1c2>1C1).*$";

之后,您可以从命名组中提取文本

            string strRegex = @"^.*(?<c1c>C1C)\s*(?<c1c2>1C1).*$";
        RegexOptions myRegexOptions = RegexOptions.Multiline;
        Regex myRegex = new Regex(strRegex, myRegexOptions);
        string strTargetString = @"LJHLJHL HJGJKDGKJ JGJK  C1C 1C1 LKJLKJ";
        string secondStr =  "LJHLJHL HJGJKDGKJ JGJK  C1C 1C1 ON";

        Match match = myRegex.Match(strTargetString);

        string c1c = match.Groups["c1c"].Value;
        string c1c2 = match.Groups["c1c2"].Value;
        Console.WriteLine(c1c + " " +c1c2);