Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Проверить регексом  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72982
Строка длиной от 1 до 4 должна состоять из символов ABCD, при этом не должно быть повторов.
Регекс с таким вообще справится?
26 сен 19, 16:20    [21980058]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
Тебе в один приём надо?
26 сен 19, 16:27    [21980067]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
Повторы в произвольно порядке или подряд?
26 сен 19, 16:28    [21980068]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72982
В один прием, порядок произвольный.
26 сен 19, 16:29    [21980069]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145742
Теоретически можно.
Нужно написать регулярку со всеми возможными значениями.

A|B|C|D|AB|AC|AD|BA|BC|BD ... и так далее
28 сен 19, 09:40    [21981551]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
кажись получилось

^((?<!.*A.*)A(?!.*A.*)|(?<!.*B.*)B(?!.*B.*)|(?<!.*C.*)C(?!.*C.*)|(?<!.*D.*)D(?!.*D.*)){1,4}$
28 сен 19, 15:36    [21981673]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
fkthat
Member

Откуда:
Сообщений: 4642
Shocker.Pro
кажись получилось


:-))) Очешуеть....

Не проще ли вот так:

var isValid = string.Concat(str.OrderBy(c => c)) == "ABCD";
29 сен 19, 22:15    [21982177]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
fkthat
Не проще ли вот так:
Твой код вообще не соответствует условию задачи, даже если забыть про требование одного регекспа Картинка с другого сайта.
29 сен 19, 22:28    [21982189]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
hVostt
Member

Откуда:
Сообщений: 19144
Shocker.Pro
fkthat
Не проще ли вот так:
Твой код вообще не соответствует условию задачи, даже если забыть про требование одного регекспа Картинка с другого сайта.


Почему нет? По мне так отличный вопрос на собеседование :)
30 сен 19, 01:18    [21982256]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Colt
Member

Откуда:
Сообщений: 68
fkthat
var isValid = string.Concat(str.OrderBy(c => c)) == "ABCD";


А сработает ли это для строк, длина которых меньше 4 (если я правильно понял условия ТС, такое допустимо)
30 сен 19, 06:44    [21982291]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
fkthat
Member

Откуда:
Сообщений: 4642
Colt

А сработает ли это для строк, длина которых меньше 4 (если я правильно понял условия ТС, такое допустимо)


var isValid = !string.IsNullOrEmpty(str) && "ABCD".StartsWith(string.Concat(str.OrderBy(c => c)));
30 сен 19, 07:03    [21982297]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6154
Да, вот уж где к месту вспомнить фразу Завински про now they have two problems.
30 сен 19, 08:33    [21982321]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
hVostt
Почему нет?
потому что строка от 1 до 4
hVostt
По мне так отличный вопрос на собеседование :)
какой именно?
fkthat
var isValid = !string.IsNullOrEmpty(str) && "ABCD".StartsWith(string.Concat(str.OrderBy(c => c)));
все равно не соответствует условию, ты не проверяешь что ли?

petalvik
@"([ABCD]).*\1|[^ABCD]"
Браво. Недооценивал этот приём )
30 сен 19, 09:04    [21982336]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
fkthat
Member

Откуда:
Сообщений: 4642
Shocker.Pro
все равно не соответствует условию, ты не проверяешь что ли?


Во, блин. Может мне еще юнит-тестами покрыть все это. Я просто кинул идею, что сходу в голову пришло. Кому она по душе - пускай уже дорабатывает сам. :-)
30 сен 19, 11:17    [21982465]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4159
hVostt,

а по моему, это плохой пример для собеседования
30 сен 19, 12:01    [21982515]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
fkthat
Shocker.Pro
все равно не соответствует условию, ты не проверяешь что ли?


Во, блин. Может мне еще юнит-тестами покрыть все это. Я просто кинул идею, что сходу в голову пришло. Кому она по душе - пускай уже дорабатывает сам. :-)
Эта идея вообще ни о чем, она не проверяет Len<4, и доработать её до нужной кондиции нельзя.
30 сен 19, 12:05    [21982519]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6154
Shocker.Pro
Эта идея вообще ни о чем, она не проверяет Len<4, и доработать её до нужной кондиции нельзя.

Вроде как всё прекрасно проверяется:
foreach(var s in new []{"ABC", "ABCD", "ABCDD"})
  Console.WriteLine("{0} {1} {2}", s, s.Length, "ABCD".StartsWith(s, StringComparison.OrdinalIgnoreCase));

ABC 3 True
ABCD 4 True
ABCDD 5 False
30 сен 19, 12:39    [21982584]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
Сон Веры Павловны
Вроде как всё прекрасно проверяется:
проверь "ABD"
30 сен 19, 12:50    [21982600]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
В принципе, на Linq вполне реализуется в одну строку, с применением Except/Intersect и Group+Count например. Но топик-то о регулярках
30 сен 19, 12:52    [21982605]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
fkthat
Member

Откуда:
Сообщений: 4642
Shocker.Pro
она не проверяет Len<4, и доработать её до нужной кондиции нельзя.


Точняк. Я косяканул. Глаз замылился.

Впрочем, в реале я бы вообще не парился и написал бы тупо:

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]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
hVostt
Member

Откуда:
Сообщений: 19144
Shocker.Pro
hVostt
Почему нет?
потому что строка от 1 до 4
hVostt
По мне так отличный вопрос на собеседование :)
какой именно?


Такой вопрос, а про регулярку это такой подвох :)
30 сен 19, 13:32    [21982655]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
hVostt
Member

Откуда:
Сообщений: 19144
Roman Mejtes
hVostt,

а по моему, это плохой пример для собеседования


почему же?
30 сен 19, 13:32    [21982657]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4159
hVostt
Roman Mejtes
hVostt,

а по моему, это плохой пример для собеседования


почему же?
такие узкоспециализированные вопросы, которые в памяти (в уме) еще не так просто решить, это не лучший вопрос, как задание после собеседования норм, а как вопрос на собеседовании, это вообще не вариант, если только не нужен специалист по работе с текстом и regex, я бы в уме такое не решил, к примеру, но не считаю это для себя проблемой
30 сен 19, 14:27    [21982732]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
hVostt
Member

Откуда:
Сообщений: 19144
Roman Mejtes
такие узкоспециализированные вопросы, которые в памяти (в уме) еще не так просто решить, это не лучший вопрос, как задание после собеседования норм, а как вопрос на собеседовании, это вообще не вариант, если только не нужен специалист по работе с текстом и regex, я бы в уме такое не решил, к примеру, но не считаю это для себя проблемой


всё верно, собеседование далеко не похоже на спокойную рабочую атмосферу, стресс.. всё такое.
я в корне не согласен, судить в отрицательном ключе о человеке, если он не выдал решение на задачу с подвохом. однако если таки выдал решение, особенно изобретательное, красивое и простое -- то это явный плюсек в карму :)
30 сен 19, 15:55    [21982894]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
fkthat
В половине случаев самый тупой способ он впоследствии самый понятный и поддерживаемый. А среднестатистический регексп, обычно, даже сам его автор на следующий день прочитать уже не может Картинка с другого сайта.
Давно зная Антонария уверен, что он понимает, что лучше написать простой и понятный код. И раз он поставил вопрос именно так, значит реальная задача того потребовала и, скорее всего, она несколько шире. Например потребовалось запихнуть это выражение в атрибут проверки поля или еще что-то подобное

Сообщение было отредактировано: 30 сен 19, 17:22
30 сен 19, 16:07    [21982917]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145742
petalvik
([ABCD]).*\1|[^ABCD]

А не переоценил ли?

Вроде по условию повторов не должно быть?

К сообщению приложен файл. Размер - 77Kb
30 сен 19, 18:54    [21983134]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22306
Тут инверсное условие. Надо проверять !IsMatch
30 сен 19, 18:58    [21983139]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
hVostt
Member

Откуда:
Сообщений: 19144
Лано, так уж и быть, ловите :)

^(?:([ABCD])(?!.*\1))*$
30 сен 19, 19:02    [21983151]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
hVostt
Member

Откуда:
Сообщений: 19144
Shocker.Pro
Тут инверсное условие. Надо проверять !IsMatch


нет, регекс был не верный, хоть и направление верное :)
30 сен 19, 19:02    [21983152]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
hVostt
Member

Откуда:
Сообщений: 19144
поиграться и понять как это работает можно здесь

https://www.debuggex.com/r/YUDIXzJxQw8Gg_lV
30 сен 19, 19:07    [21983160]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145742
hVostt
Shocker.Pro
Тут инверсное условие. Надо проверять !IsMatch


нет, регекс был не верный, хоть и направление верное :)

Коты правду носом чуют
1 окт 19, 15:49    [21984036]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Проверить регексом  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72982
Shocker.Pro
fkthat
В половине случаев самый тупой способ он впоследствии самый понятный и поддерживаемый. А среднестатистический регексп, обычно, даже сам его автор на следующий день прочитать уже не может Картинка с другого сайта.
Давно зная Антонария уверен, что он понимает, что лучше написать простой и понятный код. И раз он поставил вопрос именно так, значит реальная задача того потребовала и, скорее всего, она несколько шире. Например потребовалось запихнуть это выражение в атрибут проверки поля или еще что-то подобное
Еще хуже. ABCD являются аргументом и обозначают уровни заголовков в таблице. В соответствии с набором букв их нужно выводить и группировать в экселе. При ошибке в наборе слать нах.
11 фев 21, 12:21    [22279432]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72982
hVostt
Лано, так уж и быть, ловите :)

^(?:([ABCD])(?!.*\1))*$
+
Картинка с другого сайта.
11 фев 21, 12:25    [22279435]     Ответить | Цитировать Сообщить модератору
 Re: Проверить регексом  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72982
Сейчас задача попроще.

"Слово1, что угодно, Слово2" - между Слово1 и Слово2 не должно быть только Слово3.
11 фев 21, 12:31    [22279442]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / WinForms, .Net Framework Ответить