автоформатирование по содержанию.

Автор alpold, 19 декабря 2018, 13:39

0 Пользователи и 1 гость просматривают эту тему.

alpold

Цитата: Bigor от 20 декабря 2018, 14:46
Спасибо обоим :) понял ошибку в своей формуле

ps поправил =ISNUMBER(SEARCH("(катаракта)+.* OD"; $Sheet1.$A$2))
эта тож рабочая))какую посоветуете тогда? с какой меньше проблем может возникнуть ?

bigor

те, которые mikekaganski предложил, они более универсальные
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

alpold

Цитата: Bigor от 20 декабря 2018, 17:41
те, которые mikekaganski предложил, они более универсальные
В плане? я в той просто ничего вообще не понимаю))) твоя в принципе понятная

bigor

если у тебя окажется слово odometr или osnova, т.е. начинающие на OS или OD моя в текущем виде будет врать. У mikekaganski я сам не все понимаю :) но работает правльно
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

alpold

Цитата: Bigor от 20 декабря 2018, 17:46
если у тебя окажется слово odometr или osnova, т.е. начинающие на OS или OD моя в текущем виде будет врать. У mikekaganski я сам не все понимаю :) но работает правльно
понял)))

alpold

Цитата: Bigor от 20 декабря 2018, 17:46
если у тебя окажется слово odometr или osnova, т.е. начинающие на OS или OD моя в текущем виде будет врать. У mikekaganski я сам не все понимаю :) но работает правльно
можешь посмотреть пост по мультивыбору из выпадающего списка. Я там тебя спрашивал ты не видел нверное.

mikekaganski

Цитата: Bigor от 20 декабря 2018, 17:46
У mikekaganski я сам не все понимаю :) но работает правльно
:)
Цитата: mikekaganski от 20 декабря 2018, 13:27
катаракта([^s]|((?<!\bo)s)|(s(?!\b)))*\bOD\b

Эта регулярка разбивается на такие части:

катаракта - это просто эти символы в этом порядке в любом месте текста, то есть наша найденная подстрока должна начинаться этим словом.

([^s]|((?<!\bo)s)|(s(?!\b)))* - выражение во внешних скобках - то есть [^s]|((?<!\bo)s)|(s(?!\b)) - повторяется ноль или больше раз (об этом говорит *). Скобки сгруппировали выражения, чтобы звёздочка относилась ко всем им. Это выражение, в свою очередь, делится на три части, разделённые |, что значит, что в каждом случае это может быть одно из трёх:
- [^s] - это любой символ, кроме s.
- (?<!\bo)s - это символ s, только если прямо перед ним нет символа o, начинающего слово. (?<!\bo) - это негативное предусловие, запрещающее последовательность \bo, где \b - признак границы слова.
- s(?!\b) - это символ s, только если он не завершает слово.

Наконец, \bOD\b - это просто символы OD, обрамлённые границами слов. Граница слова - это пробел, точка, начало или конец строки, ... то есть просто не буквенноцифровой символ.

Таким образом, всё выражение можно прочитать так:
"Найти подстроку, начинающуюся со слова катаракта, после которого идёт любое количество любых символов, кроме s, или s, если перед s не стоит o в начале слова, или s, если он не заканчивает слово; завершает искомую последовательность отдельное слово OD".

Этим я обеспечил, что между "катаракта" и "OD" нет отдельного слова "os", что значило бы, что слово "катаракта" на самом деле относилось к левому глазу.
С уважением,
Михаил Каганский

bigor

позанудствую :) а зачем условие кроме s?
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

Чтобы позволить любые другие буквы. Например, "катаракта зрелая OD".
С уважением,
Михаил Каганский

bigor

Цитата: mikekaganski от 20 декабря 2018, 19:36Чтобы позволить любые другие буквы
у меня почему-то и без этого условия работает.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

Цитата: Bigor от 20 декабря 2018, 20:21у меня почему-то и без этого условия работает.
Я не вполне понимаю, какое именно регулярное выражение работает на какой именно строке.
С уважением,
Михаил Каганский

bigor

=ISNUMBER(SEARCH("катаракта((?<!\bo)d)|(d(?!\b))*\bos\b"; $Sheet1.$A$2))

содержимое a2 :
ЦитироватьКатаракта fkhk htrhtrhj ооооуауц рр  od рррр  OS

результат истина
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

:) А если это же выражение переделать для левого глаза, будет работать (т.е., выдавать ложь)? нет, тоже будет истина. Потому что отсутствуют охватывающие скобки. И звёздчка относится только к (d(?!\b)). И выражение читается "или 'катаракта', после которой сразу идёт d(перед которой нет s), или любое (в т.ч. 0) количество символов d не в конце слова; а после всего этого отдельное слово os". Что это выражение находит? оно находит ноль символов d, за которыми идёт os.
С уважением,
Михаил Каганский

bigor

блин, и правда скобок не хватает :( Вернул веру в логику, а то вроде недолжно, а работает :)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

@Bigor: Спасибо! этот разбор подсказал мне более простой и прозрачный вариант:

OD:
катаракта((?<!\bos\b).)*\bOD\b
OS:
катаракта((?<!\bod\b).)*\bOS\b
С уважением,
Михаил Каганский