我正在尝试使用带有C#代码的正则表达式,我可以在这里找到一些关于这些正则表达式对于我的原因看起来像什么的例子,但我无处可告诉我应该如何(语法上)实现进入我的逻辑和代码。
我已尝试设置外部.cs文件然后调用该方法,但返回的值无法以任何方式进行转换或处理。 代码可以在这里找到:Checking strings for a strong enough password
无论如何,我只想知道如何检查(并测试)密码中的值,以确保它符合我指定的标准。
比建议使用正则表达式更好的方法(因为有关如何将它们合并到我自己的特定逻辑设置中的信息非常稀疏且非常令人困惑)
......建议如何在没有它们的情况下完成它。
我知道我可以使用
foreach(char c in myString)
然后逐个字符地逐个测试,但我希望有一种更好的方法可以是正则表达式,解释(也就是说,解释如何将这个建议付诸行动,而不只是发布一串似乎(但是不是)随机字符并且告诉,嘿使用那个!),或者根本不使用正则表达式,但也许是一些简写。
真相是我会使用正则表达式,但每次我查看它时,我似乎无法在WebMatrix中找到任何可用的东西。
我希望能够测试密码以确保它具有大写和小写的数字。另外我需要检查至少一个号码。
更新: 好吧,请允许我重新解释一下我的问题,也许我感到困惑......
正则表达式如何在webmatrix razor(C#)中运行。请说明正则表达式实际上是如何工作的(我似乎无法在Web上为webmatrix找到明确的,甚至接近清晰的答案),然后请说明如何将其(直接或间接)放入逻辑中,在我的cshtml页面上,以便我可以实际检查它。
答案 0 :(得分:3)
正如您将发现的,正则表达式(正则表达式)是一种用于将文本与模式匹配甚至提取或替换源文本中的匹配项的工具。
为此,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]"
正如您所看到的,正则表达式模式可以像第一个示例中一样简单,但可能会根据您要检查或提取的信息类型快速升级。
在上面的正则表达式中,方括号之间的项称为字符类。元素后面的加号是量词,它表示该项目可能出现一次或多次。由竖条分隔的项目表示替代方案。 “\ 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.";
}
...
答案 1 :(得分: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/
答案 2 :(得分: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示例。