正则表达式特殊字符

本文关键字:特殊字符 正则表达式 | 更新日期: 2023-09-27 18:32:10

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

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。我将如何更改此正则表达式以包含此表达式?谢谢!

正则表达式特殊字符

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

因此,您希望除序列x(空格 x 空格)之外的任何 alpha 字符(可选地嵌入在非空格字符中,尽管这些字符被列为可选字符,因此它们实际上无关紧要)匹配并触发失败。

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

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

非常接近。

编辑:这使用负的后视结构。 (?<!仅当从当前匹配位置开始,前面的字符与括号其余部分内的内容不匹配时,才允许正则表达式继续前进。 因此,如果有领先的x它将失败比赛。

--

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

  • 123-123-1234
  • 123-123-1234 转789
  • 123-123-1234 x 789

但它确实匹配:

  • 123-123A-1234
  • 123-123 ASDFASDF 12312
  • 123-123×123123
  • 123-123 XFASDF

匹配的那些是无效的,因为你的 if 语句中的!

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

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

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

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

我强烈建议积极的验证,而不是消极的无效。


编辑:@Aprillion建议之前的链接问题:电话号码验证的综合正则表达式

这表明电话号码验证有多复杂(尤其是当您在 1 个国家/地区进行验证时)。 里面有很多好的建议,尽管这不是万能的总结。 我的倾向是在前端只允许数字(带有可选的自由注释字段)输入电话号码。

我还必须承认,它确实让我对积极验证的信心有所降低——特别是如果你必须处理任意的国际#。

很大程度上取决于OP的实际要求。

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

还是我错过了什么?

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

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

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

('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;

如果这不是你所追求的,那么你必须提供一些背景。