用于空格分隔的字符串的正则表达式,不能以下划线开头

时间:2014-09-16 10:29:38

标签: c# regex

我想验证标签列表 - 用空格分隔的字符串。例子:

"blue white   green123 #$#! ()!!!123  q_w_e_r_t_y"

唯一的要求是他们不能以下划线'_'开头。什么是匹配这些标签的合适的正则表达式?


我写了一些测试用例来验证模式的正确性:

public void RegexTest()
{
    //arrange
    const string pattern = @"^PATTERN$";
    var regex = new Regex(pattern);
    var positive = new[] { "AAA", "A_", "AAA AAA", "AAA_AAAA", "AAA_AA AAA_aaa AA___   AAA", "A____", "333A%#$%#@%$__=-21-2-AA213", "+=-_0987654321`!@#$%^&*() qwertyu:/.," };
    var negative = new[] { "_AAAA", "A _AA ", "AA _AA", "A B _C", "_ " };

    //act
    var positiveMatches = positive.Select(x => regex.IsMatch(x)).ToArray();
    var negativeMatches = negative.Select(x => regex.IsMatch(x)).ToArray();

    //assert
    CollectionAssert.AreEqual(positiveMatches.Select(x => true).ToArray(), positiveMatches);
    CollectionAssert.AreEqual(new bool[negativeMatches.Length], negativeMatches);
}

3 个答案:

答案 0 :(得分:2)

只需使用负前瞻来检查前面没有空格或开始锚点的下划线。

^(?:(?!\s_|^_).)*$

DEMO

答案 1 :(得分:1)

(?!^_)(?!.*?\s_\w)^.*$

试试这个。看看演示。

http://regex101.com/r/iO1uK1/5

答案 2 :(得分:1)

这个正则表达式应该有效:

^(?!(.*\s+)?_\w*\b).+$

RegEx Demo