Regex, чтобы соответствовать шаблону, только если его длина больше значения - PullRequest
3 голосов
/ 15 июля 2011

У меня есть 2 строки, и я хочу знать

  1. если строка 2 имеет подмножество символов строки 1 на тот же заказ

  2. это подмножество имеет минимальный размер, определенный мной.

Например:

string 1 = stackoverflow
<br>minimun size = 5

string 2a = stack (MATCH)
string 2b = stac  (DO NOT MATCH)
string 2c = staov (MATCH)
string 2d = staZov (DO NOT MATCH)
string 2e = eflow (MATCH) 
string 2f = ewolf (DO NOT MATCH)
string 2g = somethingstacksomething (MATCH) 

Я строю регулярное выражение, поэтому первую часть проблемы можно решить с помощью выражения: (s)?(t)?(a)?(c)?(k)?(o)?(v)?(e)?(r)?(f)?(l)?(o)?(w)?

Но я не могу понять, как применить правило "минимального персонажа". Можно ли это сделать с помощью регулярных выражений?

заранее спасибо!

РЕДАКТИРОВАТЬ: Добавлен еще один пример для завершения спецификации проблемы. Кроме того, если вы хотите знать, это часть метода для оценки надежности пароля, указанного пользователем. Если он определяет пароль, полученный из другой информации (логин, дата рождения, имя и т. Д.), Мы должны предупредить его.

Ответы [ 3 ]

2 голосов
/ 15 июля 2011

Но я не могу понять, как применить правило "минимальный символ".

После того, как вы определите возможные совпадения. Вам необходимо определить длину результата.

Вы можете просто использовать String.Length , чтобы определить это.

2 голосов
/ 15 июля 2011

Вы можете добавить заглядывание, обеспечивающее наличие пяти символов: (?=.{5})s?t?a?c?k?o?v?e?r?f?l?o?w?

1 голос
/ 15 июля 2011

Интересный вопрос!Есть способ сделать это (но вам это не понравится).Это приводит к потенциально большому (и, возможно, медленному) регулярному выражению.Предполагая, string1 является ABCD.Далее приведены регулярные выражения для всех требований к разной длине:

length  = 4;
regex = @"
  ABCD
  ";

length  = 3;
regex = @"
    ABCD?
  | ABC?D
  | AB?CD
  | A?BCD
  ";

length  = 2;
regex = @"
    ABC?D?
  | AB?CD?
  | AB?C?D
  | A?BCD?
  | A?BC?D
  | A?B?CD
  ";

length  = 1
regex = @"
  [ABCD]
  ";

Я не продумал, как вы собираетесь собрать эту программу программно, но я уверен, что это можно сделать.Тем не менее, большое регулярное выражение, имеющее множество альтернатив OR, может быть медленнее, чем при использовании совпадения ", а затем проверить длину подходящей строки" метод, который вы используете в настоящее время.

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

...