On Jan 13, 5:41 pm, Junkone <junko... / gmail.com> wrote: > On Jan 13, 4:25 pm, Junkone <junko... / gmail.com> wrote: > > > > > Hello > > I have with great effort started on teh regex implemention and am > > stuck at one point. > > here is my code > > (add)\s+\S+\s+[i|s|f]\s+[pei]?\s+ > > > The string is as follows and the tokens are equavalent to > > 1 token=Add > > 2 token=any text > > 3. token=one of the following i or s or f > > 4.token= 0 or 1 of the following characters [p e i] > > > I am stuck at the 4th token. i thought ? after the token will give > > the 0 or 1 option. > > pl correct me if i made a error > > > seede > > irb(main):046:0> a=Regexp.new('(add)\s+(\S+)\s+([i|s|f])\s+([pei])?\s > +',true) > => /(add)\s+(\S+)\s+([i|s|f])\s+([pei])?\s+/i > irb(main):047:0> a =~("Add comp i pe") > => nil > > I dont get match at 4th token There are a few problems here, I think. Regexp.new('(add)\s+(\S+)\s+([i|s|f])\s+([pei])?\s+',true) As written, the second token can't have whitespace. Is that what you intended? You want ([isf]) for your third token. That will match a single instance of one of the three characters. Also, I'm not clear on what you want for the fourth token. Do you want 0 or 1 of [pei] or 0 or 1 of *each* of [pei] - which of these are valid for the fourth token: e or pe. You should also end the regex with \s* unless there's always going to be whitespace. You're currently checking for one or more whitespace characters at the end, but your test didn't have any. Assuming you do allow 0 or 1 of each of [pei] for the fourth token and 0 or more whitespace characters at the end, I would use: r = /(add)\s+(\S+)\s+([isf])\s+(p?e?i?)\s*/i Though, if there can't be whitespace in any of the tokens, you might want to use split rather than a regex. The regex above can only get the fourth token right if the letters are in order - p will match, ei will match, ip will not. Split wouldn't have that problem. There may be a regex way around that, but I can't think of it at the moment. "Add comp i ep".scan r # => [["Add", "comp", "i", "e"]] "Add comp i ep".split # => ["Add", "comp", "i", "ep"]