Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何:以长度介于2和150之间的数字/字母开头的正则表达式_C#_Regex - Fatal编程技术网

C# 如何:以长度介于2和150之间的数字/字母开头的正则表达式

C# 如何:以长度介于2和150之间的数字/字母开头的正则表达式,c#,regex,C#,Regex,我一直在学习正则表达式,在想出一个模式时遇到了一些困难 要求必须以字母、数字或@开头。 在第一个字符后,它可以包含任何字母、数字、#、@、-或。 它的长度必须至少为2,且不超过150。它不能以空格开头,但可以在2-150的任何位置有空格。(如果您认为以0为基础,则为0-149) 我的测试用例是 9 Times 我正在测试的完整模式是: ^[\dA-Za-z-.@#]{2,150}$ 这些案例有效: MichaelTest 9MichaelTest #MichaelTest @MichaelT

我一直在学习正则表达式,在想出一个模式时遇到了一些困难

要求必须以字母、数字或@开头。 在第一个字符后,它可以包含任何字母、数字、#、@、-或。 它的长度必须至少为2,且不超过150。它不能以空格开头,但可以在2-150的任何位置有空格。(如果您认为以0为基础,则为0-149)

我的测试用例是

9 Times
我正在测试的完整模式是:

^[\dA-Za-z-.@#]{2,150}$
这些案例有效:

MichaelTest
9MichaelTest
#MichaelTest
@MichaelTest
任何有空间的东西都不起作用

比如9次

我开始看到问题是空间…我如何允许空间,而不是第一个字符?(感谢将军的提示)

谢谢! M

必须以字母、数字或开头@

就是这个

^[A-Za-z0-9@#]
之后,您应该检查一个模式,该模式可以包含空格、列出的任何其他字符,最大限制为-1(因为您已经检查了一个起始字符),然后使用
$

[ A-Za-z0-9@#.-]{1,149}$

然后,把它们粘在一起

试试正则表达式:
^[\dA-Za-z@#][\dA-Za-z@#.-]{1149}$

说明: 第一个字符将是
\dA-Za-z@#

后跟至少1到最多149个字符的
\dA-Za-z@-,使总字符数至少达到2个,最多达到150个。

这将适用于您:

@"^[a-zA-Z\d#@][a-zA-Z\d#@\-\. ]{1,149}$"
可以使用变量和字符串插值来构建:

var start = @"a-zA-Z\d#@";
var then = start + @"\-\. ";
var regex = new Regex($@"[{start}][{then}]{{1,149}}");
试验 这是

使用系统;
使用系统文本;
使用System.Text.RegularExpressions;
公共课程
{
公共静态void Main()
{
var start=@“a-zA-Z\d#@”;
然后,var=start+@“\-\”;
var regex=newregex($@“[{start}][{then}]{{1149}”);
测试(正则表达式);
}
公共静态孔隙试验(Regex-Regex)
{
常数int numTests=10;
常量int stringLength=150;
var rand=new Random();
var start=新字符串[]{“1”、“a”、“#”、“@”、“};
然后var=newstring[]{“1”,“a”,“#”,“@”,“-”,“,”};
对于(变量i=0;i
我正在不需要逃避测试的地方进行测试。还有-。如果我在^[\dA-Za-z-.@#]$末尾加上$,它在9次上不匹配。你写这句话的意思是什么:“以数字或字母开头,#或@。”不清楚#或@在哪里符合要求。我编辑了我的帖子,试图更清楚一些。测试用例未使用#或@。但问题是当我尝试9次时。第一部分^[\dA-Za-z-.@#]适用于其他字符串,如@9次。但是它失败了9次。专业提示。对于正则表达式的帮助,总是要放大量的测试用例来显示哪些是通过的,哪些是失败的,语言有时很难确定您到底想要什么,特别是如果您不是绝对具体和定义的。向我们展示10件会成功的事情和一些会失败的事情。您的问题可能会在第二时间得到回答。我建议您检查输入的总长度,以及它是否以一个与表达式分开的字符串开头,该表达式传递的字符串长度超过150个字符。@ShaunLuttin可以分享一个例子吗?我加了
$
,如果你是这个意思的话是的。
$
就是我的意思。另外,对于C#.NET正则表达式,我们需要避开破折号和句点。谢谢,这非常好。我在第一个答案上抓住了你的观点,我想是因为最后的美元。经过测试,这是我想要的最正确的答案。
using System;
using System.Text;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        var start = @"a-zA-Z\d#@";
        var then = start + @"\-\. ";
        var regex = new Regex($@"[{start}][{then}]{{1,149}}");
        Test(regex);
    }

    public static void Test(Regex regex)
    {
        const int numTests = 10;
        const int stringLength = 150;
        var rand = new Random();
        var start = new string[]{"1", "a", "#", "@", };
        var then = new string[]{"1", "a", "#", "@", "-", ".", " "};
        for (var i = 0; i < numTests; ++i)
        {
            var builder = new StringBuilder(start[0]);
            for (var j = 1; j < stringLength; ++j)
            {
                var r = rand.Next() % then.Length;
                builder.Append(then[r]);
            }

            var test = builder.ToString();
            Console.WriteLine($"{test} {regex.IsMatch(test)}");
        }
    }
}