Другие предоставили решения для вашего конкретного случая, поэтому я просто остановлюсь на «условии if», упомянутом в заголовке.
.NET поддерживает условные выражения, используя следующий шаблон.
(?(bob)[a-z]+|[0-9]+)
Регулярное выражение сначала попытается сопоставить текстовое выражение (часть во внутренних скобках), если оно совпадает, тогда выражение over all попытается сопоставить, используя подвыражение перед каналом ([a-z]+
), иначе оно будетпопробуйте сопоставить, используя подвыражение после канала ([0-9]+
).
Сказав все это, я думаю, что негативный взгляд в будущее, предложенный Stema, будет лучше соответствовать тому, что вы пытаетесь сделать.
Примечание: «тестовая» часть также может использовать любое из утверждений нулевой ширины, таких как отрицательный взгляд за спиной.
(?(?<!\s)[a-z]+|[0-9]+)
Конечно, взгляд вперед с нулевой шириной избыточенВ качестве «тестового» выражения всегда рассматривается нулевая ширина.