正则表达式特殊字符

时间:2012-04-25 18:28:28

标签: c# regex

我有这个正则表达式的代码:

string lPattern = "\\S*[a-zA-Z]+\\S*";

System.Text.RegularExpressions.Regex lRegex =
    new System.Text.RegularExpressions.Regex(lPattern);

if (!lRegex.IsMatch(phone))
{
    return true;
}

我想这样做,如果空格x空格“x”在字符串中也将返回true。我如何更改此正则表达式以包含此内容?谢谢!

4 个答案:

答案 0 :(得分:2)

" x |\\S*[a-zA-Z]+\\S*"

还是我错过了什么?

答案 1 :(得分:2)

显然,此代码试图通过匹配电话号码中的任何字母字符来验证电话号码 - 如果匹配,则电话号码无效。

所以你想要任何alpha字符(可选地嵌入非空白字符,尽管这些字符被列为可选项,因此它们实际上是不相关的)除了要匹配和触发的序列x(空格x空格)故障。

这听起来像是要接受人们在电话号码中嵌入分机的情况,例如:123-123-1234 x 789

.*([a-zA-Z])+(?<! x).*

非常接近。

编辑:这使用负面的后视构造。 (?<!允许正则表达式仅在从当前匹配位置继续前进时,前面的字符与括号的其余部分内的字符不匹配。因此,如果有一个前导x,则会使比赛失败。

-

使用此正则表达式,以下内容不匹配:

  • 123-123-1234
  • 123-123-1234 x789
  • 123-123-1234 x 789

但确实匹配:

  • 123-123a-1234
  • 123-123 asdfasdf 12312
  • 123-123x-123123
  • 123-123 xfasdf

根据您的if语句中的!,匹配的内容无效

但话说回来,如果你把电话号码验证作为肯定的验证(即你允许什么),而不是消极的失效(你特别避免什么),你的代码会容易得多。通过编写您允许的内容,您将能够更轻松地防止边缘情况。

例如,以下两个正则表达式都不匹配:

  • 123 - ### - 1234
  • 123 - $#&安培;!^(## ^#* @#(@&安培;#(# - 1234

这将从您的函数返回true。那是你真正想要的吗?

我强烈建议积极验证,而非负面失效。


编辑:@Aprillion建议上一个相关问题:A comprehensive regex for phone number validation

这显示了电话号码验证的复杂程度(特别是如果您要验证超过1个国家/地区)。那里有很多很好的建议,尽管它并不是最全面的总结。我倾向于在前端只允许数字(带有可选的免费评论字段)来输入电话号码。

我必须承认,如果你不得不与任意国际公司进行交易,它确实让我对积极验证的信心不足 - 尤其是

很多都取决于OP的实际要求。

答案 2 :(得分:0)

string lPattern = @"^\s*[a-zA-Z]+\s*$";

// Start of string
// Zero or more white space
// Letters any case 1 or more
// Zero or more white space
// End of string

\S means anything other than whitespace
\s is to match for whitespace

答案 3 :(得分:0)

如果您想验证电话号码,我还建议您转换逻辑 - 即尝试查找有效的电话号码而不是无效。限制您想要匹配的内容比考虑您想要拒绝的所有可能性更容易。

我会使用这个正则表达式:

(\d+(?:-|\s)?)+(?:\s*x\s*\d+)?

代码将成为:

string lPattern = @"(\d+(?:-|\s)?)+(?:\s*x\s*\d+)?";

        System.Text.RegularExpressions.Regex lRegex = new System.Text.RegularExpressions.Regex(lPattern);

        if (lRegex.IsMatch(phone)) return true;

如果那不是你的目标,那么你将不得不提供一些背景信息。