Регулярное выражение для соответствия последовательности перестановок - PullRequest
0 голосов
/ 11 марта 2020

При заданном наборе из n символов, какое регулярное выражение нам нужно, чтобы соответствовать последовательности 0-x перестановок этих символов?

Нам нужны перестановки. Учитывая набор из 3 символов A, B, C, мы хотим сопоставить AB C, ACB, BA C, BCA, CAB, CBA.

Однако мы хотим сопоставить последовательность этих перестановки. Последовательность может содержать 0 или более перестановок, что означает, что мы хотим сопоставить пустую строку: AB C, ABCBCA, BACCAB, BCAABCCBAAB C, et c.

Мне удалось найти решения, соответствующие перестановка , но не удалось изменить его для соответствия последовательности перестановок .

Я понимаю, что иногда используемый механизм регулярных выражений может иметь значение. Я хотел бы использовать это регулярное выражение в методе C# Microsoft.VisualStudio.TestTools.UnitTesting.StringAssert.Matches, если это что-то изменит. Мы просто хотим проверить, соответствует ли выходная строка тестируемого метода этому регулярному выражению, т. Е. Является ли последовательность перестановок заданного набора символов.

Ответы [ 2 ]

3 голосов
/ 11 марта 2020

Я не могу слишком рекомендовать 1 использование регулярного выражения здесь!

Вы можете использовать следующее регулярное выражение для проверки строк на соответствие, когда для n = 3 и символы 'A', 'B' и 'C':

/^(?:([ABC])(?!\1)([ABC])(?!\1|\2)[ABC])*$/

Демо

Регулярное выражение можно сделать самодокументированным, написав его в free- интервальный режим :

/
^           # match beginning of line
(?:         # begin non-capture group
  ([ABC])   # match 'A', 'B' or 'C' in capture group 1
  (?!\1)    # next character cannot be the content of capture group 1
  ([ABC])   # match 'A', 'B' or 'C' in capture group 2
  (?!\1|\2) # next character cannot be the content of capture group 1 or 2
  [ABC]     # match 'A', 'B' or 'C'
)           # end non-capture group
*           # execute non-capture group 0+ times
$           # match end of line
/x          # free-spacing mode

(?!\1|\2) - это отрицательные взгляды .

Я использовал привязки начала и конца строки для облегчения тестирование на линии, но якоря начала и конца строки будут более подходящими (\A и \z).

1 Предполагается буквальное толкование.

0 голосов
/ 11 марта 2020

Вы можете просто использовать маленького помощника, я думаю,

static bool Check(string source, string target)
{
   int? sLen = source?.Length, tLen = target?.Length;

   if (!(sLen > 0) || !(tLen > 0) || tLen % sLen != 0)
      return false;

   IEnumerable<string> Chunks(string str, int chunkSize)
      => Enumerable.Range(0, str.Length / chunkSize)
                   .Select(i => str.Substring(i * chunkSize, chunkSize));

   return Chunks(target, source.Length).All(x => source.All(x.Contains));

}

Это, вероятно, будет намного быстрее, чем регулярное выражение, и может иметь дело с нулями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...