代码之家  ›  专栏  ›  技术社区  ›  Jedidja

如何创建正则表达式以确保单词仅由给定的单个字母和字母组组成?

  •  2
  • Jedidja  · 技术社区  · 17 年前

    • “a”将匹配“a”、“aa”、“aaa”,但不匹配“ab”
    • “ababc”将匹配“a”、“ab”、“abc”、“aabc”、“baabc”,但不匹配“ababac”

    (a|b|abc)*
    

    可以,但它与上一个术语不匹配。以下是我正在测试的代码:

    [Fact]
    public void TestRegex()
    {
        Regex regex = new Regex("(a|b|abc)*");
        regex.IsMatch("a").ShouldBeTrue();
        regex.IsMatch("b").ShouldBeTrue();
        regex.IsMatch("abc").ShouldBeTrue();
        regex.IsMatch("aabc").ShouldBeTrue();
        regex.IsMatch("baabc").ShouldBeTrue();
    
        // This should not match ... I don't think anyway
        regex.IsMatch("ababac").ShouldBeFalse();
    }
    

    我对正则表达式有一个相当基本的理解,所以如果我遗漏了一些明显的东西,我深表歉意:)

    使现代化 我不明白为什么你的反例是反例:ababac=abababac。你能澄清一下吗?

    让我再举一个例子:使用“ba”和“t”,我可以匹配“bat”,但不能匹配“tab”。字母组中字母的顺序很重要。

    (使用Diadistis溶液进行试验)

        [Fact]
        public void TestRegex()
        {
            Regex regex = new Regex(@"\A(?:(e|l|ho)*)\Z");
            regex.IsMatch("e").ShouldBeTrue();
            regex.IsMatch("l").ShouldBeTrue();
            regex.IsMatch("ho").ShouldBeTrue();
            regex.IsMatch("elho").ShouldBeTrue();
            regex.IsMatch("hole").ShouldBeTrue();
            regex.IsMatch("holle").ShouldBeTrue();
            regex.IsMatch("hello").ShouldBeFalse();
            regex.IsMatch("hotel").ShouldBeFalse();
        }
    
    2 回复  |  直到 17 年前
        1
  •  4
  •   Diadistis    17 年前

    我不太清楚您想做什么,但为了使最后一个为假,您应该检查字符串是否可以完全匹配:

    Regex regex = new Regex(@"\A(?:(a|b|abc)*)\Z");
    
        2
  •  2
  •   Michael Burr    17 年前

    试着用括号括住你的正则表达式 ^ $ 为确保完全考虑整条线路:

    ^(a|b|abc)*$