Рассмотрим, прежде чем читать дальше: Rege xes: not always the best way для решения проблемы. Если вы рассматриваете регулярное выражение, но это не очевидно или просто для продолжения, вы можете остановиться и подумать, есть ли удобное решение без регулярного выражения.
Я не знаю, какова ваша конкретная ситуация или почему вы думаете, что вам нужно регулярное выражение, поэтому я предполагаю, что вы уже знаете выше и ответили на свой вопрос как есть.
На основе документации, я считаю, что Рубин поддерживает позитивные lookaheads (также известные как нулевую ширину утверждений). Будучи в первую очередь программистом .NET, я не знаю Ruby достаточно хорошо, чтобы сказать, поддерживает ли он или не поддерживает фиксированные длины (он не встречается во всех вариантах regex), но если это так, вы можете легко применить три разных вида в начале вашего выражения, чтобы найти каждый из шаблонов или символов, которые необходимо:
^(?=.*a)(?=.*b)(?=.*c).*
Это не сработает, если какой-либо один из lookaheads не проходит. Этот подход потенциально чрезвычайно эффективен, потому что вы можете иметь сложные подвыражения в своем представлении. Например:
^(?=.*a[bc]{2})(?=.*-\d)(?=.*#.{3}%).*
будет проверить, что входное содержит follwed два символов, каждый из которых либо б или с, А - следует любой цифра и #, за которым следуют любые три символа, за которыми следует %, в любом конкретном порядке. Таким образом, следующие строки будут проходить:
#acb%-9
#-22%abb
Этот вид сложного сопоставления с образцом трудно сжато дублировать.
Чтобы решить эту проблему comment:
Нет, не может быть ...так ABCD не принято
Вы можете использовать отрицательный предпросмотр, чтобы гарантировать, что символы другие чем искомых символов нет на входе:
^(?=.*a)(?=.*b)(?=.*c)(?!.*[^abc]).*
(As noted by Gene, то .*
на конец не нужен ... Возможно, я должен был упомянуть об этом. Это просто на случай, если вы действительно хотите выбрать текст)
Любая конкретная причина, вы хотите использовать Regex для этого? – Hubro
'a + b + c + | a + c + b + | c + b + a + | ....' :)) – quetzalcoatl
Может ли строка содержать все символы из списка, а также другие? например является ли «abcd» действительным? – mikej