Я пытаюсь создать регулярное выражение, пригодное для использования в 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();
}