2015-02-18 6 views
2

Я играл, но я не могу получить следующее: я хотел бы иметь возможность проверить повторное (спамное) использование одного символа и одного символ только в строке произвольной длины. Очевидно, использование регулярного выражения.Регулярные выражения - Совпадение с чем-либо, кроме захвата

1111111111111 - должно соответствовать

1111111112111 - НЕ должен соответствовать

!!!!!!!!!!!!! - должен соответствовать

!!!!!!a!!!!!! - НЕ должен соответствовать

или наоборот; как и в, я отлично справляюсь с TRUE или FALSE для результата. Пока я могу получить результат. Я не являюсь рег бывший гуру, я полагал, что я имел его с чем-то вдоль линий

^.*(.).*(?!\1)$ 

... но не повезло.

Edit (18 февраля 2015, 11:11 GMT +1):

Частично закончить дебаты, которые имели место в течение работы и других подобных тем, по которым решение является лучшим, я решил бенчмарка 3 первичного предлагаемые решения; регулярное выражение, метод Linq Distinct() и функциональность ORDER BY Linq.

Результаты:

Generating data (1000 crytopgraphically strong random passwords)......done

Testing begins now!

Regular expression......done, 1000 iterations took 3033 microseconds

string.Distinct......done, 1000 iterations took 10822 microseconds

Order by (Linq)......done, 1000 iterations took 13566 microseconds

ответ

1

Я считаю, что вы ищете следующее, чтобы иметь строку повторяющихся символов.

^(.)\1*$ 
-1
Public Function IsSpam(value As String) As Boolean 
    Dim a = From n In value.ToCharArray() Order By n Descending 
      Order By n Descending 

    Return a(0) = a(a.Count - 1) 
End Function 

Является альтернативой использованию Regex.