Как мне создать регулярное выражение, чтобы убедиться, что слово состоит только из заданных отдельных букв и групп букв? - PullRequest
2 голосов
/ 18 декабря 2008

Я пытаюсь создать регулярное выражение, пригодное для использования в C #, которое позволит мне взять список из отдельных букв и / или буквенных групп и убедиться, что слово состоит только из элементов из этого списка. Например:

  • 'a' будет соответствовать 'a', 'aa', 'aaa', но не 'ab'
  • «a b» будет соответствовать «a», «ab», «abba», «b», но не «abc»
  • 'a b abc' будет соответствовать '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 = a b a bac. c Не могли бы вы уточнить?

Я только хочу использовать «a», «b» и «abc» - «bac» - это совершенно другой термин.

Позвольте мне привести другой пример: используя «ba» и «t», я мог бы сопоставить слово «bat», но не «tab». Порядок букв внутри групп букв важен.

(тесты с использованием решения Диадистиса)

    [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 ]

4 голосов
/ 18 декабря 2008

Я не совсем уверен, что вы пытаетесь сделать, но для того, чтобы последний был ложным, вы должны проверить, может ли строка полностью соответствовать:

Regex regex = new Regex(@"\A(?:(a|b|abc)*)\Z");
2 голосов
/ 18 декабря 2008

Попробуйте заключить в скобки свое регулярное выражение с ^ и $, чтобы убедиться, что рассматривается именно вся строка:

^(a|b|abc)*$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...