facebook
facebook

Reputation: 1864

problem in regular expression

I am having a regular expression

 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);

and having a string

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

I have to fetch C1C 1C1.This running fine. But if a modify test string as

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

then it is unable to find the pattern i.e C1C 1C1. any idea why this expression is failing?

Upvotes: 4

Views: 131

Answers (3)

Sergey K
Sergey K

Reputation: 4114

As I understood you need to find the C1C 1C1 text in your string I've used this regex for do this

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

after that you can extract text from named groups

            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);

Upvotes: 1

stema
stema

Reputation: 92976

You are searching for a not a following DFIOQU with your negative look ahead (?!.*[DFIOQU])

In your second string there is a O at the end in ON, so it must be failing to match.

If you remove the .* in your negative look ahead it will only check the directly following character and not the complete string to the end (Is it this what you want?).

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

then it works, see it here on Regexr. It is now checking if there is not one of the characters in the class directly after the digit, I don't know if this is intended.

Btw. I removed the | from your first character class, its not needed and also some brackets around your whitespaces, also not needed.

Upvotes: 1

mu is too short
mu is too short

Reputation: 434585

You have a negative look ahead:

(?!.*[DFIOQU])

That matches the "O" in "ON" and since it is a negative look ahead, the whole pattern fails. And, as an aside, I think you want to replace this:

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

With this:

[A-CEGHJ-NPR-TVYX]

A pipe (|) is a literal character inside a character class, not an alternation, and you can use ranges to help hilight the characters that you're leaving out.

A single regex might not be the best way to parse that string. Or perhaps you just need a looser regex.

Upvotes: 3

Related Questions