How to check a text contains a certain character within selenium - c#

I have a method below where I retrieve a HTML tag:
public void CheckEmailDisplayed()
{
var email = _driver.FindElement(ConfirmationResponsiveElements.ViewEmail);
}
ViewEmail is below:
public static By ViewEmail => By.ClassName("confirmation-banner__text");
The HTML it corresponds to is:
<div class="confirmation-banner__text firefinder-match">
<p>
We've sent an email to
<strong>firstname#xxx.com</strong>
</p>
<p>
</div>
What I want to do is be able to use the variable email to check that the text contains an #. This is to help determine an email address is displayed. How can this be achieved?
Thanks

Option 1: Check for the # symbol
string email = "test#domain.com";
if (email.Contains("#"))
{
// code here
}
Option 2: Validate Email Address
public static bool IsEmail(string emailToValidate)
{
if (string.IsNullOrEmpty(emailToValidate)) return true;
return Regex.IsMatch(emailToValidate, #"^([a-zA-Z0-9_\-\.]+)#((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}
How to use option 2:
string email = "test#domain.com";
if (IsEmail(email))
{
// valid email address
}
else
{
// not a valid email address
}

You can add another definition
public static By ViewEmailAddress => By.TagName("strong");
Then use
var emailAddress = emai.FindElement(ConfirmationResponsiveElements.ViewEmailAddress);
var emailAddressText = emailAddress.Text;
And then you can do different operations that you want on emailAddressText. Like validating it having # or doing more complex validations like a email pattern check

You can use IndexOf method
bool found = Value1.IndexOf("abc", 0, 7) != -1;
OR
You can also use regular expressions (less readable though)
string regex = "^.{0,7}abc";
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(regex);
string Value1 = "sssddabcgghh";
Console.WriteLine(reg.Match(Value1).Success);
Source :-
How to determine if string contains specific substring within the first X characters

Related

Regex doesn't recognize String C#

I'm working with Regex Class. I'm trying to figure it out, how many common matches a String
has in another String.
Here is the situation:
MainWindow.DetailBLL.Name = "Top Senders By Total Threat Messages"
String detailName = MainWindow.DetailBLL.Name;
Extracted from:
MainWindow = Window Class
DetailBLL = Class
Name = Variable
public String Name
{
get { return _Name; }
set { _Name = value; }
}
CharacterReplacement(openedFile) = "Incoming Mail Domains Top Senders By Total Threat Messages"
String fileName = CharacterReplacement(openedFile);
Extracted from:
OpenFileDialog openedFile = new OpenFileDialog();
Incoming_Mail_Domains_Top_Senders_by_Graymail_Messages_RawData.csv
private String CharacterReplacement(OpenFileDialog file)
{
String input = file.SafeFileName;
String output = input.Replace("_", " ").Replace("RawData", " ").Replace("by", "By").Replace(".csv", " ");
//output: "Incoming Mail Domains Top Senders By Graymail Messages"
return output;
}
This method takes the file's name (The name of a .csv file) and convert it to a readable String, returning it as is depicted.
The use of the Regex Class:
String source = detailName;
String searchPattern = fileName;
1st try: Doesn't work
int count = Regex.Matches(searchPattern, source).Count;
or doesn't work
int count = Regex.Matches(fileName, detailName).Count;
if (count > 0)
{
System.Windows.MessageBox.Show("Match!");
}
2nd try: Doesn't work
foreach (Match match in Regex.Matches(fileName, detailName))
or doesn't work
foreach (Match match in Regex.Matches(searchPattern, source))
{
System.Windows.MessageBox.Show("Matches: " + counter++);
}
I've noticed something, Regex doesn't work like this way. There's no recognition on the variables:
String source = detailName;
String searchPattern = fileName;
Only works when the variables are like this:
String source = "Top Senders By Total Threat Messages";
String searchPattern = "Incoming Mail Domains Top Senders By Total Threat Messages";
But, this won't work for me, I need them to evaluate as a implicit (Non-Literal) String, not as a explicit (Literal) one,
cause the variables change everytime.
There's a way to get to it please?
Well, first of all - you probably do not need regex (still I recommend to read about regex https://www.regular-expressions.info/).
I guess that you need to count how many words are contained in both strings. What your comments neither question says is if you want to count the same word twice or just once.
Here you can find basic sample:
using System;
using System.Linq;
namespace SearchLinq
{
class Program
{
static void Main(string[] args)
{
string source = "Top Senders By Total Threat Messages";
string find = "Incoming Mail Domains Top Senders By Total Threat Messages";
// first possible solution
int result = 0;
foreach (string word in find.Split(' '))
{
if (source.Contains(word))
{
result++;
}
}
Console.WriteLine(result);
// second possible solution
int result2 = find.Split(' ').Count(w => source.Contains(w));
Console.WriteLine(result2);
}
}
}

handle escape (#) character in xamarin xaml [duplicate]

I use this
#"^([\w\.\-]+)#([\w\-]+)((\.(\w){2,3})+)$"
regexp to validate the email
([\w\.\-]+) - this is for the first-level domain (many letters and numbers, also point and hyphen)
([\w\-]+) - this is for second-level domain
((\.(\w){2,3})+) - and this is for other level domains(from 3 to infinity) which includes a point and 2 or 3 literals
what's wrong with this regex?
EDIT:it doesn't match the "something#someth.ing" email
TLD's like .museum aren't matched this way, and there are a few other long TLD's. Also, you can validate email addresses using the MailAddress class as Microsoft explains here in a note:
Instead of using a regular expression to validate an email address,
you can use the System.Net.Mail.MailAddress class. To determine
whether an email address is valid, pass the email address to the
MailAddress.MailAddress(String) class constructor.
public bool IsValid(string emailaddress)
{
try
{
MailAddress m = new MailAddress(emailaddress);
return true;
}
catch (FormatException)
{
return false;
}
}
This saves you a lot af headaches because you don't have to write (or try to understand someone else's) regex.
EDIT: For those who are allergic to try/catch: In .NET 5 you can use MailAddress.TryCreate. See also https://stackoverflow.com/a/68198658, including an example how to fix .., spaces, missing .TLD, etc.
I think #"^([\w\.\-]+)#([\w\-]+)((\.(\w){2,3})+)$" should work.
You need to write it like
string email = txtemail.Text;
Regex regex = new Regex(#"^([\w\.\-]+)#([\w\-]+)((\.(\w){2,3})+)$");
Match match = regex.Match(email);
if (match.Success)
Response.Write(email + " is correct");
else
Response.Write(email + " is incorrect");
Be warned that this will fail if:
There is a subdomain after the # symbol.
You use a TLD with a length greater than 3, such as .info
I have an expression for checking email addresses that I use.
Since none of the above were as short or as accurate as mine, I thought I would post it here.
#"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*"
+ "#"
+ #"((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$";
For more info go read about it here: C# – Email Regular Expression
Also, this checks for RFC validity based on email syntax, not for whether the email really exists. The only way to test that an email really exists is to send and email and have the user verify they received the email by clicking a link or entering a token.
Then there are throw-away domains, such as Mailinator.com, and such. This doesn't do anything to verify whether an email is from a throwaway domain or not.
I found nice document on MSDN for it.
How to: Verify that Strings Are in Valid Email Format
http://msdn.microsoft.com/en-us/library/01escwtf.aspx
(check out that this code also supports the use of non-ASCII characters for Internet domain names.)
There are 2 implementation, for .Net 2.0/3.0 and for .Net 3.5 and higher.
the 2.0/3.0 version is:
bool IsValidEmail(string strIn)
{
// Return true if strIn is in valid e-mail format.
return Regex.IsMatch(strIn, #"^([\w-\.]+)#((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
}
My tests over this method give:
Invalid: #majjf.com
Invalid: A#b#c#example.com
Invalid: Abc.example.com
Valid: j..s#proseware.com
Valid: j.#server1.proseware.com
Invalid: js*#proseware.com
Invalid: js#proseware..com
Valid: ma...ma#jjf.co
Valid: ma.#jjf.com
Invalid: ma##jjf.com
Invalid: ma#jjf.
Invalid: ma#jjf..com
Invalid: ma#jjf.c
Invalid: ma_#jjf
Invalid: ma_#jjf.
Valid: ma_#jjf.com
Invalid: -------
Valid: 12#hostname.com
Valid: d.j#server1.proseware.com
Valid: david.jones#proseware.com
Valid: j.s#server1.proseware.com
Invalid: j#proseware.com9
Valid: j_9#[129.126.118.1]
Valid: jones#ms1.proseware.com
Invalid: js#internal#proseware.com
Invalid: js#proseware.com9
Invalid: js#proseware.com9
Valid: m.a#hostname.co
Valid: m_a1a#hostname.com
Valid: ma.h.saraf.onemore#hostname.com.edu
Valid: ma#hostname.com
Invalid: ma#hostname.comcom
Invalid: MA#hostname.coMCom
Valid: ma12#hostname.com
Valid: ma-a.aa#hostname.com.edu
Valid: ma-a#hostname.com
Valid: ma-a#hostname.com.edu
Valid: ma-a#1hostname.com
Valid: ma.a#1hostname.com
Valid: ma#1hostname.com
The following code is based on Microsoft's Data annotations implementation on github and I think it's the most complete validation for emails:
public static Regex EmailValidation()
{
const string pattern = #"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))#((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$";
const RegexOptions options = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture;
// Set explicit regex match timeout, sufficient enough for email parsing
// Unless the global REGEX_DEFAULT_MATCH_TIMEOUT is already set
TimeSpan matchTimeout = TimeSpan.FromSeconds(2);
try
{
if (AppDomain.CurrentDomain.GetData("REGEX_DEFAULT_MATCH_TIMEOUT") == null)
{
return new Regex(pattern, options, matchTimeout);
}
}
catch
{
// Fallback on error
}
// Legacy fallback (without explicit match timeout)
return new Regex(pattern, options);
}
This does not meet all of the requirements of RFCs 5321 and 5322, but it works with the following definitions.
#"^([0-9a-zA-Z]([\+\-_\.][0-9a-zA-Z]+)*)+"#(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z0-9]{2,17})$";
Below is the code
const String pattern =
#"^([0-9a-zA-Z]" + //Start with a digit or alphabetical
#"([\+\-_\.][0-9a-zA-Z]+)*" + // No continuous or ending +-_. chars in email
#")+" +
#"#(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z0-9]{2,17})$";
var validEmails = new[] {
"ma#hostname.com",
"ma#hostname.comcom",
"MA#hostname.coMCom",
"m.a#hostname.co",
"m_a1a#hostname.com",
"ma-a#hostname.com",
"ma-a#hostname.com.edu",
"ma-a.aa#hostname.com.edu",
"ma.h.saraf.onemore#hostname.com.edu",
"ma12#hostname.com",
"12#hostname.com",
};
var invalidEmails = new[] {
"Abc.example.com", // No `#`
"A#b#c#example.com", // multiple `#`
"ma...ma#jjf.co", // continuous multiple dots in name
"ma#jjf.c", // only 1 char in extension
"ma#jjf..com", // continuous multiple dots in domain
"ma##jjf.com", // continuous multiple `#`
"#majjf.com", // nothing before `#`
"ma.#jjf.com", // nothing after `.`
"ma_#jjf.com", // nothing after `_`
"ma_#jjf", // no domain extension
"ma_#jjf.", // nothing after `_` and .
"ma#jjf.", // nothing after `.`
};
foreach (var str in validEmails)
{
Console.WriteLine("{0} - {1} ", str, Regex.IsMatch(str, pattern));
}
foreach (var str in invalidEmails)
{
Console.WriteLine("{0} - {1} ", str, Regex.IsMatch(str, pattern));
}
Best email validation regex
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*#(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
And it's usage :-
bool isEmail = Regex.IsMatch(emailString, #"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*#(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z", RegexOptions.IgnoreCase);
new System.ComponentModel.DataAnnotations.EmailAddressAttribute().IsValid(input)
As an update to the popular answer of Alex: In .NET 5 MailAddress now has a TryCreate. So you can do something like:
public static bool IsValidEmail(string email)
{
if (!MailAddress.TryCreate(email, out var mailAddress))
return false;
// And if you want to be more strict:
var hostParts = mailAddress.Host.Split('.');
if (hostParts.Length == 1)
return false; // No dot.
if (hostParts.Any(p => p == string.Empty))
return false; // Double dot.
if (hostParts[^1].Length < 2)
return false; // TLD only one letter.
if (mailAddress.User.Contains(' '))
return false;
if (mailAddress.User.Split('.').Any(p => p == string.Empty))
return false; // Double dot or dot at end of user part.
return true;
}
Why not use EF6 attribute based e-mail validation?
As you can see above, Regex validation for e-mail always has some hole in it. If you are using EF6 data annotations, you can easily achieve reliable and stronger e-mail validation with EmailAddress data annotation attribute available for that. I had to remove the regex validation I used before for e-mail when I got mobile device specific regex failure on e-mail input field. When the data annotation attribute used for e-mail validation, the issue on mobile was resolved.
public class LoginViewModel
{
[EmailAddress(ErrorMessage = "The email format is not valid")]
public string Email{ get; set; }
Try this on for size:
public static bool IsValidEmailAddress(this string s)
{
var regex = new Regex(#"[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*#(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?");
return regex.IsMatch(s);
}
This regex works perfectly:
bool IsValidEmail(string email)
{
return Regex.IsMatch(email, #"^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*#((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))\z");
}
Email validation using regex
string pattern = #"\A(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*#(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)\Z";
//check first string
if (Regex.IsMatch(EmailId1 , pattern))
{
//if email is valid
Console.WriteLine(EmailId1+ " is a valid Email address ");
}
Source: email validation c#
Validation Without Regex using MailAddress.MailAddress(String) class constructor
public bool IsEmailValid(string emailaddress)
{
try
{
MailAddress m = new MailAddress(emailaddress);
return true;
}
catch (FormatException)
{
return false;
}
}
This one prevents invalid emails mentioned by others in the comments:
Abc.#example.com
Abc..123#example.com
name#hotmail
toms.email.#gmail.com
test#-online.com
It also prevents emails with double dots:
hello..world#example..com
Try testing it with as many invalid email addresses as you can find.
using System.Text.RegularExpressions;
public static bool IsValidEmail(string email)
{
return Regex.IsMatch(email, #"\A[a-z0-9]+([-._][a-z0-9]+)*#([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,4}\z")
&& Regex.IsMatch(email, #"^(?=.{1,64}#.{4,64}$)(?=.{6,100}$).*");
}
See validate email address using regular expression in C#.
Try this, it's working for me:
public bool IsValidEmailAddress(string s)
{
if (string.IsNullOrEmpty(s))
return false;
else
{
var regex = new Regex(#"\w+([-+.']\w+)*#\w+([-.]\w+)*\.\w+([-.]\w+)*");
return regex.IsMatch(s) && !s.EndsWith(".");
}
}
To validate your email ID, you can simply create such method and use it.
public static bool IsValidEmail(string email)
{
var r = new Regex(#"^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*#([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$");
return !String.IsNullOrEmpty(email) && r.IsMatch(email);
}
This will return True / False. (Valid / Invalid Email Id)
It has taken many attempts to create an email validator which catches nearly all worldwide requirements for email.
Extension method you can call with:
myEmailString.IsValidEmailAddress();
Regex pattern string you can get by calling:
var myPattern = Regex.EmailPattern;
The Code (mostly comments):
/// <summary>
/// Validates the string is an Email Address...
/// </summary>
/// <param name="emailAddress"></param>
/// <returns>bool</returns>
public static bool IsValidEmailAddress(this string emailAddress)
{
var valid = true;
var isnotblank = false;
var email = emailAddress.Trim();
if (email.Length > 0)
{
// Email Address Cannot start with period.
// Name portion must be at least one character
// In the Name, valid characters are: a-z 0-9 ! # _ % & ' " = ` { } ~ - + * ? ^ | / $
// Cannot have period immediately before # sign.
// Cannot have two # symbols
// In the domain, valid characters are: a-z 0-9 - .
// Domain cannot start with a period or dash
// Domain name must be 2 characters.. not more than 256 characters
// Domain cannot end with a period or dash.
// Domain must contain a period
isnotblank = true;
valid = Regex.IsMatch(email, Regex.EmailPattern, RegexOptions.IgnoreCase) &&
!email.StartsWith("-") &&
!email.StartsWith(".") &&
!email.EndsWith(".") &&
!email.Contains("..") &&
!email.Contains(".#") &&
!email.Contains("#.");
}
return (valid && isnotblank);
}
/// <summary>
/// Validates the string is an Email Address or a delimited string of email addresses...
/// </summary>
/// <param name="emailAddress"></param>
/// <returns>bool</returns>
public static bool IsValidEmailAddressDelimitedList(this string emailAddress, char delimiter = ';')
{
var valid = true;
var isnotblank = false;
string[] emails = emailAddress.Split(delimiter);
foreach (string e in emails)
{
var email = e.Trim();
if (email.Length > 0 && valid) // if valid == false, no reason to continue checking
{
isnotblank = true;
if (!email.IsValidEmailAddress())
{
valid = false;
}
}
}
return (valid && isnotblank);
}
public class Regex
{
/// <summary>
/// Set of Unicode Characters currently supported in the application for email, etc.
/// </summary>
public static readonly string UnicodeCharacters = "À-ÿ\p{L}\p{M}ÀàÂâÆæÇçÈèÉéÊêËëÎîÏïÔôŒœÙùÛûÜü«»€₣äÄöÖüÜß"; // German and French
/// <summary>
/// Set of Symbol Characters currently supported in the application for email, etc.
/// Needed if a client side validator is being used.
/// Not needed if validation is done server side.
/// The difference is due to subtle differences in Regex engines.
/// </summary>
public static readonly string SymbolCharacters = #"!#%&'""=`{}~\.\-\+\*\?\^\|\/\$";
/// <summary>
/// Regular Expression string pattern used to match an email address.
/// The following characters will be supported anywhere in the email address:
/// ÀàÂâÆæÇçÈèÉéÊêËëÎîÏïÔôŒœÙùÛûÜü«»€₣äÄöÖüÜß[a - z][A - Z][0 - 9] _
/// The following symbols will be supported in the first part of the email address(before the # symbol):
/// !#%&'"=`{}~.-+*?^|\/$
/// Emails cannot start or end with periods,dashes or #.
/// Emails cannot have two # symbols.
/// Emails must have an # symbol followed later by a period.
/// Emails cannot have a period before or after the # symbol.
/// </summary>
public static readonly string EmailPattern = String.Format(
#"^([\w{0}{2}])+#{1}[\w{0}]+([-.][\w{0}]+)*\.[\w{0}]+([-.][\w{0}]+)*$", // #"^[{0}\w]+([-+.'][{0}\w]+)*#[{0}\w]+([-.][{0}\w]+)*\.[{0}\w]+([-.][{0}\w]+)*$",
UnicodeCharacters,
"{1}",
SymbolCharacters
);
}
public static bool ValidateEmail(string str)
{
return Regex.IsMatch(str, #"\w+([-+.']\w+)*#\w+([-.]\w+)*\.\w+([-.]\w+)*");
}
I use the above code to validate the email address.
public bool VailidateEntriesForAccount()
{
if (!(txtMailId.Text.Trim() == string.Empty))
{
if (!IsEmail(txtMailId.Text))
{
Logger.Debug("Entered invalid Email ID's");
MessageBox.Show("Please enter valid Email Id's" );
txtMailId.Focus();
return false;
}
}
}
private bool IsEmail(string strEmail)
{
Regex validateEmail = new Regex("^[\\W]*([\\w+\\-.%]+#[\\w\\-.]+\\.[A-Za-z] {2,4}[\\W]*,{1}[\\W]*)*([\\w+\\-.%]+#[\\w\\-.]+\\.[A-Za-z]{2,4})[\\W]*$");
return validateEmail.IsMatch(strEmail);
}
This is my favorite approach to this so far:
public static class CommonExtensions
{
public static bool IsValidEmail(this string thisEmail)
=> !string.IsNullOrWhiteSpace(thisEmail) &&
new Regex(#"^([\w\.\-]+)#([\w\-]+)((\.(\w){2,3})+)$").IsMatch(thisEmail);
}
Then use the created string extension like:
if (!emailAsString.IsValidEmail()) throw new Exception("Invalid Email");
There's no perfect regular expression, but this one is pretty strong, I think, based on study of RFC5322. And with C# string interpolation, pretty easy to follow, I think, as well.
const string atext = #"a-zA-Z\d!#\$%&'\*\+-/=\?\^_`\{\|\}~";
var localPart = $"[{atext}]+(\\.[{atext}]+)*";
var domain = $"[{atext}]+(\\.[{atext}]+)*";
Assert.That(() => EmailRegex = new Regex($"^{localPart}#{domain}$", Compiled),
Throws.Nothing);
Vetted with NUnit 2.x.
Just let me know IF it doesn't work :)
public static bool isValidEmail(this string email)
{
string[] mail = email.Split(new string[] { "#" }, StringSplitOptions.None);
if (mail.Length != 2)
return false;
//check part before ...#
if (mail[0].Length < 1)
return false;
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(#"^[a-zA-Z0-9_\-\.]+$");
if (!regex.IsMatch(mail[0]))
return false;
//check part after #...
string[] domain = mail[1].Split(new string[] { "." }, StringSplitOptions.None);
if (domain.Length < 2)
return false;
regex = new System.Text.RegularExpressions.Regex(#"^[a-zA-Z0-9_\-]+$");
foreach (string d in domain)
{
if (!regex.IsMatch(d))
return false;
}
//get TLD
if (domain[domain.Length - 1].Length < 2)
return false;
return true;
}
I've created a FormValidationUtils class to validate email:
public static class FormValidationUtils
{
const string ValidEmailAddressPattern = "^[A-Z0-9._%+-]+#[A-Z0-9.-]+\\.[A-Z]{2,6}$";
public static bool IsEmailValid(string email)
{
var regex = new Regex(ValidEmailAddressPattern, RegexOptions.IgnoreCase);
return regex.IsMatch(email);
}
}
Try the Following Code:
using System.Text.RegularExpressions;
if (!Regex.IsMatch(txtEmail.Text, #"^[a-z,A-Z]{1,10}((-|.)\w+)*#\w+.\w{3}$"))
MessageBox.Show("Not valid email.");
STRING SEARCH USING REGEX METHOD IN C#
How to validate an Email by Regular Expression?
string EmailPattern = #"\w+([-+.']\w+)*#\w+([-.]\w+)*\.\w+([-.]\w+)*";
if (Regex.IsMatch(Email, EmailPattern, RegexOptions.IgnoreCase))
{
Console.WriteLine("Email: {0} is valid.", Email);
}
else
{
Console.WriteLine("Email: {0} is not valid.", Email);
}
Use Reference String.Regex() Method
string patternEmail = #"(?<email>\w+#\w+\.[a-z]{0,3})";
Regex regexEmail = new Regex(patternEmail);
1
^[\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*#((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))$
2
^(([^<>()[\]\\.,;:\s#\""]+(\.[^<>()[\]\\.,;:\s#\""]+)*)|(\"".+\""))#((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$
I think your caret and dollar sign are part of the problem
You should also modify the regex a little, I use the next
#"[ :]+([\w.-]+)#([\w-.])+((.(\w){2,3})+)"
Regex Email Pattern:
^(?:[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+\\.)*[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\`\\{\\|\\}\\~]+#(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\\-](?!\\.)){0,61}[a-zA-Z0-9]?\\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\\[(?:(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\]))$
I've been using the Regex.IsMatch().
First of all you need to add the next statement:
using System.Text.RegularExpressions;
Then the method looks like:
private bool EmailValidation(string pEmail)
{
return Regex.IsMatch(pEmail,
#"^(?("")("".+?(?<!\\)""#)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])#))" +
#"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$",
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
}
It's a private method because of my logic but you can put the method as static in another Layer such as "Utilities" and call it from where you need.

Conditional <br> for address format in C#

I am formatting my application to show the address related to a specific work ticket. Occasionally the address uses a second line. I don't want to use the following:
<%: ticket.ADDRESS2 %><br />
In this scenario, if the object is null or empty I still get the break and then I have a large space that looks funny.
I thought I could generate my own string and then turn it into a literal with something like this:
string str = ((Object)ticket.ADDRESS2 != "").ToString();
string sAdd2 = str + <br />;
myLiteral.Text = sAdd2;
But that doesn't actually help me out if the Object is null or empty (in fact, I don't even know if it works at all.
So then I tried this:
public string sAdd2
{
get
{
Object oAdd2 = ticket.ADDRESS2;
if (oAdd2 != null)
{
string sAdd2 = ((Object)ticket.ADDRESS2 != "").ToString();
}
else
{
string sAdd2 = ((Object)ticket.ADDRESS2 == "").ToString();
}
}
}
With this I get errors at the 'get' (not all code paths return a value). I feel like I am going way out of the way to do a simple thing. I just want to have my page show
Address Line 1
Address Line 2
City, State ZIP
or
Address Line 1
City, State ZIP
Anyone have any pointers? I've looked up "conditional breaks" but didn't get much of a useful return.
Use an if statement
<%if (!string.IsNullOrEmpty(ticket.ADDRESS2)) { %>
<%: ticket.ADDRESS2 %><br />
<%} %>
What I have done in the past – in an MVC project, but could easily be in code behind for WebForms – is:
var lines = new [] {
contact.Name,
contact.AddressLine1,
contact.AddressLine2,
contact.AddressLine3,
contact.PostCode
};
var address = String.Join("<br/>", lines.Where(l => !String.IsNullOrWhitespace(l));
and then use the appropriate method to write out address as a raw string.
Remove blank lines, then use string.Join() to add newlines.
// Get the address lines to be displayed
string[] lines = new string[]
{
ticket.Address1,
ticket.Address2,
ticket.Address3,
ticket.Address4,
ticket.ZipCode,
};
// Remove blank lines
IEnumerable<string> filledLines = lines.Where(s => !string.IsNullOrWhitespace(s));
// Add newlines between each line
string html = string.Join(#"<br />", filledLines);

How to write a data annotation to check if email address found in string and fail on it

I have the following code but it's not quite working... Any ideas where i'm going wrong? It seems to be failing when there is a carriage return in the string? (see fiddles at bottom)
[RegularExpression(#"^((?!([\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*#((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3})))).)*$", ErrorMessage = "Please do not include an email address in your description.")]
Context
People are writing descriptions and also placing email addresses in them, for example:
"Hi there i'm bob, here is my email: example#exampele.com. Hope you
havea great day at my party."
I need to check that string and see that there is an email, and then not allow it to be submitted. (I'm using Entity framework and data annotations alongside the jquery validation in ASP .NET MVC 5... This is why i mentioned Data annotation usage.
Note:
I took the inversion technique from here:
Jquery validation on matching 'password' and 'admin' not working
And the email validation from here:
Best Regular Expression for Email Validation in C#
Attempts:
The following string:
http://pastebin.com/00BE7tUW
will show the error, whereas this will not:
http://pastebin.com/i69uxzRf
So something is a little wrong in the expression considering there is no email in it?
Fiddle:
Not working: https://regex101.com/r/zL7xD7/1
Working: https://regex101.com/r/hJ8fJ9/1
Working with email: https://regex101.com/r/dB3cU2/1
Have you tried something like this:
bool invalid = false;
public bool IsValidEmail(string strIn)
{
invalid = false;
if (String.IsNullOrEmpty(strIn))
return false;
// Use IdnMapping class to convert Unicode domain names.
try {
strIn = Regex.Replace(strIn, #"(#)(.+)$", this.DomainMapper,
RegexOptions.None, TimeSpan.FromMilliseconds(200));
}
catch (RegexMatchTimeoutException) {
return false;
}
if (invalid)
return false;
// Return true if strIn is in valid e-mail format.
try {
return Regex.IsMatch(strIn,
#"^(?("")("".+?(?<!\\)""#)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])#))" +
#"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9][\-a-z0-9]{0,22}[a-z0-9]))$",
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
}
catch (RegexMatchTimeoutException) {
return false;
}
}
private string DomainMapper(Match match)
{
// IdnMapping class with default property values.
IdnMapping idn = new IdnMapping();
string domainName = match.Groups[2].Value;
try {
domainName = idn.GetAscii(domainName);
}
catch (ArgumentException) {
invalid = true;
}
return match.Groups[1].Value + domainName;
}
The IsValidEmail method returns true if the string contains a valid email address and false if it does not, but takes no other action.
To verify that the email address is valid, the IsValidEmail method calls the Regex.Replace(String, String, MatchEvaluator) method with the (#)(.+)$ regular expression pattern to separate the domain name from the email address. The third parameter is a MatchEvaluator delegate that represents the method that processes and replaces the matched text.
Then you would check the email address by doing something like:
IsValidEmail(emailAddress)
Does this work for you?
The . needed to be replaced by [\S\s]
[RegularExpression(#"^((?!([\w!#$%&'*+\-/=?\^_`{|}~]+(\.[\w!#$%&'*+\-/=?\^_`{|}~]+)*#((([\-\w]+\.)+[a-zA-Z]{2,4})|(([0-9]{1,3}\.){3}[0-9]{1,3}))))[\S\s])*$", ErrorMessage = "Please do not include an email address in your field description.")]
source: Regular expression is not matching new lines

C#- Validation for US or Canadian zip code

I am using following method to validate US or Canadian zip code, but i think it is not working fine for me. Please suggest me the changes in the regular expression.
private bool IsUSorCanadianZipCode(string zipCode)
{
bool isValidUsOrCanadianZip = false;
string pattern = #"^\d{5}-\d{4}|\d{5}|[A-Z]\d[A-Z] \d[A-Z]\d$";
Regex regex = new Regex(pattern);
return isValidUsOrCanadianZip = regex.IsMatch(zipCode);
}
Thanks.
var _usZipRegEx = #"^\d{5}(?:[-\s]\d{4})?$";
var _caZipRegEx = #"^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$";
private bool IsUSOrCanadianZipCode(string zipCode)
{
var validZipCode = true;
if ((!Regex.Match(zipCode, _usZipRegEx).Success) && (!Regex.Match(zipCode, _caZipRegEx).Success))
{
validZipCode = false;
}
return validZipCode;
}
}
If you are using Data Annotation Validators, you can use a RegularExpression attribute like this:
[RegularExpression(#"(^\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXYabceghjklmnprstvxy]{1}\d{1}[ABCEGHJKLMNPRSTVWXYZabceghjklmnprstv‌​xy]{1} *\d{1}[ABCEGHJKLMNPRSTVWXYZabceghjklmnprstvxy]{1}\d{1}$)", ErrorMessage = "That postal code is not a valid US or Canadian postal code.")]
(regex is from the link #huMptyduMpty posted above at http://geekswithblogs.net/MainaD/archive/2007/12/03/117321.aspx but my regex allows both upper and lower case letters)
The US zipcode validation which works "on my machine" is
[RegularExpression(#"\d{5}$", ErrorMessage = "Invalid Zip Code")]

Categories

Resources