[英]Regular Expression Match for a Title
我需要使用C#为标题编写正则表达式,这是要求:
我已经有这个了:
^.{1,256}$
那么我怎样才能满足规则3?
编辑:
使用(?=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.