Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / WinForms, .Net Framework |
![]() ![]() |
Топик располагается на нескольких страницах: 1 2 [все] |
Antonariy Member Откуда: ☭ Сообщений: 72982 |
Строка длиной от 1 до 4 должна состоять из символов ABCD, при этом не должно быть повторов. Регекс с таким вообще справится? |
26 сен 19, 16:20 [21980058] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
Тебе в один приём надо? |
26 сен 19, 16:27 [21980067] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
Повторы в произвольно порядке или подряд? |
26 сен 19, 16:28 [21980068] Ответить | Цитировать Сообщить модератору |
Antonariy Member Откуда: ☭ Сообщений: 72982 |
В один прием, порядок произвольный. |
26 сен 19, 16:29 [21980069] Ответить | Цитировать Сообщить модератору |
Cat2 Member Откуда: Petroskoi, Karjala Сообщений: 145742 |
Теоретически можно. Нужно написать регулярку со всеми возможными значениями. A|B|C|D|AB|AC|AD|BA|BC|BD ... и так далее |
28 сен 19, 09:40 [21981551] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
кажись получилось^((?<!.*A.*)A(?!.*A.*)|(?<!.*B.*)B(?!.*B.*)|(?<!.*C.*)C(?!.*C.*)|(?<!.*D.*)D(?!.*D.*)){1,4}$ |
28 сен 19, 15:36 [21981673] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4642 |
:-))) Очешуеть.... Не проще ли вот так: var isValid = string.Concat(str.OrderBy(c => c)) == "ABCD"; |
||
29 сен 19, 22:15 [21982177] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
![]() |
||
29 сен 19, 22:28 [21982189] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 19144 |
Почему нет? По мне так отличный вопрос на собеседование :) |
||||
30 сен 19, 01:18 [21982256] Ответить | Цитировать Сообщить модератору |
petalvik Member Откуда: Сообщений: 708 |
Antonariy, группировка с обратной связью поможет найти повторы в произвольном порядке: string input1 = "ABCD"; string input2 = "ABCA"; string pattern = @"([ABCD]).*\1"; Console.WriteLine(Regex.IsMatch(input1, pattern)); // False Console.WriteLine(Regex.IsMatch(input2, pattern)); // True Ещё нужно отсеять все символы кроме ABCD. Поможет такой шаблон: @"([ABCD]).*\1|[^ABCD]" Работает на строках от одного до четырёх символов. Вроде то, что нужно? |
30 сен 19, 03:42 [21982283] Ответить | Цитировать Сообщить модератору |
Colt Member Откуда: Сообщений: 68 |
А сработает ли это для строк, длина которых меньше 4 (если я правильно понял условия ТС, такое допустимо) |
||
30 сен 19, 06:44 [21982291] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4642 |
var isValid = !string.IsNullOrEmpty(str) && "ABCD".StartsWith(string.Concat(str.OrderBy(c => c))); |
||
30 сен 19, 07:03 [21982297] Ответить | Цитировать Сообщить модератору |
Сон Веры Павловны Member Откуда: Сообщений: 6154 |
Да, вот уж где к месту вспомнить фразу Завински про now they have two problems. |
30 сен 19, 08:33 [21982321] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
|
||||||||
30 сен 19, 09:04 [21982336] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4642 |
Во, блин. Может мне еще юнит-тестами покрыть все это. Я просто кинул идею, что сходу в голову пришло. Кому она по душе - пускай уже дорабатывает сам. :-) |
||
30 сен 19, 11:17 [21982465] Ответить | Цитировать Сообщить модератору |
Roman Mejtes Member Откуда: г. Пермь Сообщений: 4159 |
hVostt, а по моему, это плохой пример для собеседования |
30 сен 19, 12:01 [21982515] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
|
||||
30 сен 19, 12:05 [21982519] Ответить | Цитировать Сообщить модератору |
Сон Веры Павловны Member Откуда: Сообщений: 6154 |
Вроде как всё прекрасно проверяется: foreach(var s in new []{"ABC", "ABCD", "ABCDD"}) Console.WriteLine("{0} {1} {2}", s, s.Length, "ABCD".StartsWith(s, StringComparison.OrdinalIgnoreCase));
|
||
30 сен 19, 12:39 [21982584] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
|
||
30 сен 19, 12:50 [21982600] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
В принципе, на Linq вполне реализуется в одну строку, с применением Except/Intersect и Group+Count например. Но топик-то о регулярках |
30 сен 19, 12:52 [21982605] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4642 |
Точняк. Я косяканул. Глаз замылился. ![]() Впрочем, в реале я бы вообще не парился и написал бы тупо: var valid = 0 < str.Length && str.Length < 5 && // length between 1 and 4 str.All(c => "ABCD".Contains(c) && // contains only 'A', 'B', 'C', 'D' str.Distinct().Count() == str.Length; // all chars are distinct В половине случаев самый тупой способ он впоследствии самый понятный и поддерживаемый. А среднестатистический регексп, обычно, даже сам его автор на следующий день прочитать уже не может ![]() |
||
30 сен 19, 13:10 [21982628] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 19144 |
Такой вопрос, а про регулярку это такой подвох :) |
||||||
30 сен 19, 13:32 [21982655] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 19144 |
почему же? |
||
30 сен 19, 13:32 [21982657] Ответить | Цитировать Сообщить модератору |
Roman Mejtes Member Откуда: г. Пермь Сообщений: 4159 |
|
||||
30 сен 19, 14:27 [21982732] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 19144 |
всё верно, собеседование далеко не похоже на спокойную рабочую атмосферу, стресс.. всё такое. я в корне не согласен, судить в отрицательном ключе о человеке, если он не выдал решение на задачу с подвохом. однако если таки выдал решение, особенно изобретательное, красивое и простое -- то это явный плюсек в карму :) |
||
30 сен 19, 15:55 [21982894] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
Сообщение было отредактировано: 30 сен 19, 17:22 |
||
30 сен 19, 16:07 [21982917] Ответить | Цитировать Сообщить модератору |
Cat2 Member Откуда: Petroskoi, Karjala Сообщений: 145742 |
А не переоценил ли? Вроде по условию повторов не должно быть? К сообщению приложен файл. Размер - 77Kb |
||
30 сен 19, 18:54 [21983134] Ответить | Цитировать Сообщить модератору |
Shocker.Pro Member Откуда: ->|<- :адуктО Сообщений: 22306 |
Тут инверсное условие. Надо проверять !IsMatch |
30 сен 19, 18:58 [21983139] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 19144 |
Лано, так уж и быть, ловите :)^(?:([ABCD])(?!.*\1))*$ |
30 сен 19, 19:02 [21983151] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 19144 |
нет, регекс был не верный, хоть и направление верное :) |
||
30 сен 19, 19:02 [21983152] Ответить | Цитировать Сообщить модератору |
hVostt Member Откуда: Сообщений: 19144 |
поиграться и понять как это работает можно здесь https://www.debuggex.com/r/YUDIXzJxQw8Gg_lV |
30 сен 19, 19:07 [21983160] Ответить | Цитировать Сообщить модератору |
Cat2 Member Откуда: Petroskoi, Karjala Сообщений: 145742 |
Коты правду носом чуют |
||||
1 окт 19, 15:49 [21984036] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
Antonariy Member Откуда: ☭ Сообщений: 72982 |
|
||||||
11 фев 21, 12:21 [22279432] Ответить | Цитировать Сообщить модератору |
Antonariy Member Откуда: ☭ Сообщений: 72982 |
|
|||||
11 фев 21, 12:25 [22279435] Ответить | Цитировать Сообщить модератору |
Antonariy Member Откуда: ☭ Сообщений: 72982 |
Сейчас задача попроще. "Слово1, что угодно, Слово2" - между Слово1 и Слово2 не должно быть только Слово3. |
11 фев 21, 12:31 [22279442] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: 1 2 [все] |
Все форумы / WinForms, .Net Framework | ![]() |