0

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

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

4 回答 4

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

还是我错过了什么?

于 2012-04-25T18:32:19.493 回答
2

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

所以你想要任何字母字符(可选地嵌入在非空白字符中,尽管这些被列为可选,所以它们实际上是不相关的)除了序列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 建议之前的链接问题: 电话号码验证的综合正则表达式

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

我还必须承认,这确实让我对积极验证的信心降低了一点——尤其是如果你必须与一个任意的国际 # 打交道。

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

于 2012-04-25T19:02:41.123 回答
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
于 2012-04-25T18:39:33.467 回答
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;

如果那不是您所追求的,那么您将不得不提供一些上下文。

于 2012-04-25T19:25:38.653 回答