2

我正在尝试在我的 C# 代码中使用正则表达式,我可以在此处找到一些示例,说明这些正则表达式对于我的原因可能是什么样的,但我无处可说明我应该如何(从语法上)将其实现到我的逻辑中和代码。

我尝试设置一个外部 .cs 文件,然后调用该方法,但返回的值无法以任何方式转换或使用。代码可以在这里找到:检查字符串是否有足够强的密码

无论如何,我只想知道如何检查(和测试)密码中的值,以确保它符合我指定的标准。

比建议使用正则表达式更好的方法(因为关于如何将它们合并到我自己的特定后勤设置中的信息非常稀疏且非常混乱)

...正在建议没有它们如何完成。

我知道我可以使用

foreach(char c in myString)

然后逐个字符地单独测试,但我希望有一种更好的方法可以是正则表达式,解释(也就是说,解释如何将此建议付诸实施,而不仅仅是发布一串看似(但不是)随机字符并告诉,嘿使用那个!),或者根本不使用正则表达式,但可能是某种速记。

事实是我会使用正则表达式,但每次查找它们时,我似乎都无法在 WebMatrix 中找到任何可用的东西。

我希望能够测试密码以确保它同时具有大写和小写数字。此外,我需要检查至少一个号码。

更新:好的,请允许我改写我的问题,也许我很困惑......

正则表达式如何在 webmatrix razor (C#) 中工作。请展示正则表达式的实际工作原理(我似乎无法在 webmatrix 的网络上找到一个明确的,甚至接近于明确的答案),然后请展示如何将它(直接或间接)放入 if 逻辑, 在我的 cshtml 页面上,以便我可以实际检查它。

4

3 回答 3

3

正如您将发现的,正则表达式 (Regex) 是一种用于将文本与模式匹配甚至提取或替换源文本中的匹配项的工具。

为此,Regex 引擎(存在于命名空间 System.Text.RegularExpressions 内的 .Net 框架中)使用一些已建立的模式来表示某些类型的字符。

要使用正则表达式,您需要将测试文本的模式和文本本身传递给它。

例如,以下代码段测试文本中是否有小写字母:

using System.Text.RegularExpressions;
... 
var Pattern = "[a-z]";
if (Regex.IsMatch(SomeText, Pattern)) {
//... there is at least one lower case char in the text
}

上面使用的模式我们对从小写“a”到小写“z”的一系列字符感兴趣。

需要至少一个小写字母、一个数字和一个大写字母的模式可能类似于

@"[\d]+[a-z]+[A-Z]|[\d]+[A-Z]+[a-z]|[a-z]+[\d]+[A-Z]|[a-z]+[A-Z]+[\d]|[A-Z]+[\d]+[a-z]|[A-Z]+[a-z]+[\d]"

如您所见,Regex 模式可以像第一个示例中一样简单,但根据您要检查或提取的信息类型,其复杂性可能会迅速升级。

在上面的 Regex 中,方括号之间的项目称为字符类。元素后面的加号是量词,表示该项可能出现一次或多次。由竖线分隔的项目表示备选方案。"\d" 模式表示从 "0" 到 "9" 的任何数字。

您实际上并不需要正则表达式来检查应用程序中的密码强度,但是使用 then 而不是您当前正在进行的显式测试(在我看来)会大大提高程序的可读性:

using System.Text.RegularExpressions;
... 
if (!Regex.IsMatch(password, "[A-Z]")) {
  errorMessage = "Your password must contain at least one uppercase character."; 
} else if (!Regex.IsMatch(password, "[a-z]") {
  errorMessage = "Your password must contain at least one lowercase character."; 
} else if (! Regex.IsMatch(password, @"[\d]")){
  errorMessage = "Your password must contain at least one numerical character."; 
}
...
于 2012-10-15T22:54:22.123 回答
2

如果您尝试在信息发送到服务器之前在页面上进行此测试,您可以使用 javascript 和 regex 进行检查。我认为这种方式是最好的,因为您消除了对服务器的额外访问。它可以通过 javascript 验证,将数据发布到您的站点,并且您可以在服务器上进行更多验证(以防用户关闭 javascript)。Razor 语法有助于页面呈现,但在用户在页面上执行操作时无济于事。

图案:((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,15})

这需要至少 1 个数字、1 个小写字母和 1 个大写字母。它还要求密码长度在 8 到 15 个字符之间(含)。您可以轻松更改模式中的长度要求。例如,如果您希望它至少有 8 个字符,但没有最大值:

((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,})

要在 javascript 中使用它(我确实使用 jQuery 在我的测试中连接我的点击事件并从输入中获取密码):

var password = $('#password').val();
var pattern = /((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,15})/;
var pass = pattern.test(password);

一个小提琴显示它在行动:http: //jsfiddle.net/gromer/chF4D/1/

于 2012-10-15T19:43:24.013 回答
0

好吧,我知道这不是正确执行此操作的方法,(正确的方法是使用正则表达式,这是我试图弄清楚的)但是如果您像我一样,并且厌倦了询问/搜索相同的问题一遍又一遍,没有得到任何完全有用的反馈,这对我有用。

    int Ucount = 0;
    int Lcount = 0;
    int Ncount = 0;
    foreach(char c in password)
    {
        if(c!='A' && c!='B' && c!='C' && c!='D' && c!='E' && c!='F' && c!='G' && c!='H' && c!='I' && c!='J' && c!='K' && c!='L' && c!='M' && c!='N' && c!='O' && c!='P' && c!='Q' && c!='R' && c!='S' && c!='T' && c!='U' && c!='V' && c!='W' && c!='X' && c!='Y' && c!='Z')
        {
            Ucount++;
            if(Ucount >= password.Length)
            {
                errorMessage = "Your password must contain at least one uppercase character.";
            }
        }

        if(c!='a' && c!='b' && c!='c' && c!='d' && c!='e' && c!='f' && c!='g' && c!='h' && c!='i' && c!='j' && c!='k' && c!='l' && c!='m' && c!='n' && c!='o' && c!='p' && c!='q' && c!='r' && c!='s' && c!='t' && c!='u' && c!='v' && c!='w' && c!='x' && c!='y' && c!='z')
        {
            Lcount++;
            if(Lcount >= password.Length)
            {
                errorMessage = "Your password must contain at least one lowercase character.";
            }
        }

        if(c!='0' && c!='1' && c!='2' && c!='3' && c!='4' && c!='5' && c!='6' && c!='7' && c!='8' && c!='9')
        {
            Ncount++;
            if(Ncount >= password.Length)
            {
                errorMessage = "Your password must contain at least one numerical character.";
            }
        }
    }

再次请注意,正确的方法是使用正则表达式,但这段代码对我来说很好,我必须结束理解正则表达式的野鹅追逐。

更新:或者,如果您想正确地做,请阅读上面 Branco Medeiros 的帖子,他在我发布此帖子后发布,他的方式是正确的方式(前提是您不想在 JavaScript 之前使用它发送到服务器。如果您的应用程序和我的一样,并且资源密集程度不足以需要 JavaScript 来执行此操作,请使用上面 Branco Medeiros 的示例)。

于 2012-10-15T20:24:05.373 回答