开发者

Using Regular Expression Match a String that contains numbers letters and dashes

I need to match this string 011Q-0SH3-936729 but not 345376346 or asfsdfgsfsdf It has to contain characters AND numbers AND dashes

Pattern could be 011Q-0SH3-936729 or 011Q-0SH3-936729-SDF3 or 000-222-AAAA or 011Q-0SH3-936729-011Q-0SH3-93开发者_JAVA技巧6729-011Q-0SH3-936729-011Q-0SH3-936729 and I want it to be able to match anyone of those. Reason for this is that I don't really know if the format is fixed and I have no way of finding out either so I need to come up with a generic solution for a pattern with any number of dashes and the pattern recurring any number of times.

Sorry this is probably a stupid question, but I really suck at Regular expressions.

TIA


foundMatch = Regex.IsMatch(subjectString, 
    @"^             # Start of the string
    (?=.*\p{L})     # Assert that there is at least one letter
    (?=.*\p{N})     # and at least one digit
    (?=.*-)         # and at least one dash.
    [\p{L}\p{N}-]*  # Match a string of letters, digits and dashes
    $               # until the end of the string.", 
    RegexOptions.IgnorePatternWhitespace);

should do what you want. If by letters/digits you meant "only ASCII letters/digits" (and not international/Unicode letters, too), then use

foundMatch = Regex.IsMatch(subjectString, 
    @"^             # Start of the string
    (?=.*[A-Z])     # Assert that there is at least one letter
    (?=.*[0-9])     # and at least one digit
    (?=.*-)         # and at least one dash.
    [A-Z0-9-]*      # Match a string of letters, digits and dashes
    $               # until the end of the string.", 
    RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);


EDIT:

this will match any of the key provided in your comments:

^[0-9A-Z]+(-[0-9A-Z]+)+$

this means the key starts with the digit or letter and have at leats one dash symbol:


Without more info about the regularity of the dashes or otherwise, this is the best we can do:

Regex.IsMatch(input,@"[A-Z0-9\-]+\-[A-Z0-9]")

Although this will also match -A-0


Most naive implementation EVER (might get you started):

([0-9]|[A-Z])+(-)([0-9]|[A-Z])+(-)([0-9]|[A-Z])+

Tested with Regex Coach.

EDIT:

That does match only three groups; here another, slightly better:

([0-9A-Z]+\-)+([0-9A-Z]+)


Are you applying the regex to a whole string (i.e., validating or filtering)? If so, Tim's answer should put you right. But if you're plucking matches from a larger string, it gets a bit more complicated. Here's how I would do that:

string input = @"Pattern could be 011Q-0SH3-936729 or 011Q-0SH3-936729-SDF3 or 000-222-AAAA or 011Q-0SH3-936729-011Q-0SH3-936729-011Q-0SH3-936729-011Q-0SH3-936729 but not 345-3763-46 or ASFS-DFGS-FSDF or ASD123FGH987.";

Regex pluckingRegex = new Regex(
    @"(?<!\S)         # start of 'word'
      (?=\S*\p{L})    # contains a letter
      (?=\S*\p{N})    # contains a digit
      (?=\S*-)        # contains a hyphen
      [\p{L}\p{N}-]+  # gobble up letters, digits and hyphens only
      (?!\S)          # end of 'word'
    ", RegexOptions.IgnorePatternWhitespace);

foreach (Match m in pluckingRegex.Matches(input))
{
  Console.WriteLine(m.Value);
}

output:

011Q-0SH3-936729
011Q-0SH3-936729-SDF3
000-222-AAAA
011Q-0SH3-936729-011Q-0SH3-936729-011Q-0SH3-936729-011Q-0SH3-936729

The negative lookarounds serve as 'word' boundaries: they insure the matched substring starts either at the beginning of the string or after a whitespace character ((?<!\S)), and ends either at the end of the string or before a whitespace character ((?!\S)).

The three positive lookaheads work just like Tim's, except they use \S* to skip whatever precedes the first letter/digit/hyphen. We can't use .* in this case because that would allow it to skip to the next word, or the next, etc., defeating the purpose of the lookahead.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜