繁体   English   中英

标题的正则表达式匹配

[英]Regular Expression Match for a Title

我需要使用C#为标题编写正则表达式,这是要求:

  1. 标题为必填项(长度> 0);
  2. 最多256个字符(长度<= 256);
  3. 禁止使用任何字符,但仅空白是非法的(仅包含空白的标题是非法的);
  4. 没有前导或尾随空格;

我已经有这个了:

^.{1,256}$

那么我怎样才能满足规则3?

编辑:

  1. 更清楚地解释了规则3;
  2. 我从马里奥的答案中添加了规则4。

使用(?=pattern)

@"^(?=.*\S).{1,256}$"

(?=pattern)断言指定的模式在此位置之后立即存在。

因此,正则表达式在且仅当在字符串的开头之后与模式.*\\S匹配且整个字符串与模式^.{1,256}$匹配时才匹配^.{1,256}$

您需要使用零宽度断言:

@"^(?=.*\S).{1,256}$"

(?=.*\\S)匹配以非空格字符结尾的任何字符序列,但不影响其余匹配。

我将完全跳过正则表达式,因为您可以通过两个简单的步骤对字符串的清理和验证进行硬编码:

  • 使用String.Trim(null)删除所有前导/尾随空格。
  • 比较剩余字符串的长度。
  • 大写第一个字符(如果需要)。

这是可行的,因为仅包含空格的名称将被修剪为0长度。 这也避免了使用诸如" Let's go!"标题" Let's go!"

您可以使用[^ \\ s]匹配除空格以外的任何字符

尽管我自己的答案符合我的问题,但功劳仍然应该归功于其他人(我要么赞成并选择正确的答案),因为我在他们的答案之后编辑了我的问题。

=====================

我终于提出了一个纯正则表达式解决方案(没有任何额外的步骤)

^(\S|\S.{0,254}\S)$

(尽管我不明白为什么括号()很重要)

以下测试用例通过:

    [TestMethod]
    public void CheckTitleTest()
    {
        // Empty
        Assert.IsFalse(CheckTitle(@""));

        // A whitespace
        Assert.IsFalse(CheckTitle(@" "));

        // Multiple whitespace only
        // http://msdn.microsoft.com/en-us/library/t809ektx.aspx
        Assert.IsFalse(CheckTitle("  \t \n \u1680"));

        // Leading whitespaces
        Assert.IsFalse(CheckTitle("  \tabc"));

        // Trailing whitespaces
        Assert.IsFalse(CheckTitle("abc\t "));

        // Leading and trailing whitespaces
        Assert.IsFalse(CheckTitle("  \tabc\t "));

        // Too long: 257 character
        Assert.IsFalse(CheckTitle(@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/*"));

        // A normal title
        Assert.IsTrue(CheckTitle(@"This is a normal title"));
        Assert.IsTrue(CheckTitle(@"This is a normal title."));

        // 256 characters
        Assert.IsTrue(CheckTitle(@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"));

        // A very simple title
        Assert.IsTrue(CheckTitle(@"A"));
        Assert.IsTrue(CheckTitle(@"!"));
        Assert.IsTrue(CheckTitle(@"\"));
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM