开发者

ASP.NET regular expression to restrict consecutive characters

开发者 https://www.devze.com 2023-01-20 16:48 出处:网络
Using ASP.NET syntax for the RegularEx开发者_StackOverflow社区pressionValidator control, how do you specify restriction of two consecutive characters, say character \'x\'?You can provide a regex like

Using ASP.NET syntax for the RegularEx开发者_StackOverflow社区pressionValidator control, how do you specify restriction of two consecutive characters, say character 'x'?


You can provide a regex like the following:

(\\w)\\1+

(\\w) will match any word character, and \\1+ will match whatever character was matched with (\\w).

I do not have access to asp.net at the moment, but take this console app as an example:

Console.WriteLine(regex.IsMatch("hello") ? "Not valid" : "Valid"); // Hello contains to consecutive l:s, hence not valid

Console.WriteLine(regex.IsMatch("Bar") ? "Not valid" : "Valid"); // Bar does not contain any consecutive characters, so it's valid


Alexn is right, this is the way you match consecutive characters with a regex, i.e. (a)\1 matches aa.

However, I think this is a case of everything looking like a nail when you're holding a hammer. I would not use regex to validate this input. Rather, I suggest validating this in code (just looping through the string, comparing str[i] and str[i-1], checking for this condition).


This should work:

^((?<char>\w)(?!\k<char>))*$

It matches abc, but not abbc.

The key is to use so called "zero-width negative lookahead assertion" (syntax: (?! subexpression)).

Here we make sure that a group matched with (?<char>\w) is not followed by itself (expressed with (?!\k<char>)).

Note that \w can be replaced with any valid set of characters (\w does not match white-spaces characters).

You can also do it without named group (note that the referenced group has number 2):

^((\w)(?!\2))*$

And its important to start with ^ and end with $ to match the whole text.

If you want to only exclude text with consecutive x characters, you may use this

^((?<char>x)(?!\k<char>)|[^x\W])*$

or without backreferences

^(x(?!x)|[^x\W])*$

All syntax elements for .NET Framework Regular Expressions are explained here.


You can use a regex to validate what's wrong as well as what's right of course. The regex (.)\1 will match any two consecutive characters, so you can just reject any input that gives an IsValid result to that. If this is the only validation you need, I think this way is far easier than trying to come up with a regex to validate correct input instead.

0

精彩评论

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

关注公众号