chaturanga

Рейтинг
122
Регистрация
22.08.2012
Владимир #:

на счёт того, что это не оптимально, не соглашусь, я думаю ТС будет обрабатывать на бэкенде, а не налету, а раз так, то и особо заморачиваться со скоростью работы не стоит, главное, чтобы помогало в работе

Я не про скорость в данном случае (хотя и про неё тоже), а про дальнейшее сопровождение кода и то, что регулярки - это самый простой способ выстрелить себе в ногу.

В любом случае сплиты и т.п. существенно быстрее, надёжнее и читабельнее.

Я лет 15 назад админил большой проект с 1000+ разных сайтов и их конфиги nginx хранились в виде файлов. Довольно часто в них нужно было вносить групповые правки. Вместо того чтобы сделать систему для хранения конфигов в БД и формировать их при необходимости я их "правил" регулярками с помощью grep, sed и awk. 6 лет это всё обрастало дикими regexp'ами c Backreferences, POSIX-классами и разными вариациями Extended- и PCRE- синтаксисов. И когда пришло время передать это другому админу, я понял, что и сам давно не понимаю как это работает.

С тех пор у меня от них глаз дёргается :)

Sly32 #:

Прям вау! спасибо!

Поймите - это всё из области ненормального программирования. Регулярки - это зло. Стремитесь от них избавиться везде, где есть возможность.

Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте ©

Интересный ход с незахватываемым "[A-Z][A-Za-z\s \.]"

Только стоимость жутко выросла.

Вложенный незахватываемый блок не нужен - получаем вложенный match, который вообще не используется, лучше заменить символьным классом.

ИЛИ также лучше заменить на символьные классы - сложность их раскрытия много меньше альтернативной ветки.

[\s ]* - избыточность, хотя интерпретатор должен сам её устранить

https://regex101.com/r/R43vAB/1

Понизили стоимость с 4361 до 1275.

Sly32 #:

My bad)) Я убрал экоанирование точки - прочитал что в скобках оно не нужно, но после этого поломалось. И еще - этот паттерн подразумесает любые повторения слов - : word, word, Word word; 

а можно сделать так чтоб не более  3-х слов попадало и только если  кэпитал леттер? То есть:

New York, NY, USA ;- попало

New York, Florida, NY, USA; - не попало

new york, NY, usa; не попало

Заглавная буква проверяется и в обычном варианте  https://regex101.com/r/F2WzQJ/1 и с опережающей проверкой  https://regex101.com/r/3IfTHj/1

А вот с учётом 3-х запятых... Теоретически можно, но это будет либо две тернарки, либо 2 ИЛИ. Стоимость исполнения вырастет катастрофически. Может какие-то вариации комбинирования опережающих проверок с тернаркой, но тоже будет очень сложная конструкция.

Даже пытаться не стану -  да уже за те варианты которые предложены выше надо отрывать руки - в продакшине такому не место.

Как альтернативный вариант - https://regex101.com/r/7S9KSB/1

Результат должен быть примерно тот же, но запрос будет более ресурсоёмким за счёт дополнительной опрежающей проверки.

Выборка будет без подгрупп, но с "концевыми" знаками препинания и пробелом.

Sly32 #:

споткнулось на таком :


"Note: Google’s hybrid workplace includes remote roles.

Remote location: Brazil."

Также проблем не вижу.

https://regex101.com/r/xgPrvA/1

14 и 17 выборки.

Может какие-то спецсимволы есть в исходном тексте?

Sly32 #:

Note: By applying to this position you will have an opportunity to share your preferred working location from the following: New York, NY, USA; San Francisco, CA, USA.

результат:

By applying to this position you will have an opportunity to share your preferred working location from the following; New York, NY, USA; San Francisco, CA, USA

Вообще проблем не вижу (15, 16 выборки) - https://regex101.com/r/6hfgak/1

Но, в целом, для снижения false positive лучше сделать так -  https://regex101.com/r/yNZTpQ/1

Числа экспериментально подберите.

Sly32 #:

Я к сожалению не могу полагаться на  "locations",  нет гарантии что это скрипт а не контентщик) А в таком случае мне может прилететь  "locations, lacations, lacotion" etc ))) Я вообще не могу на текст полагаться, только на шаблон, что будет что то типа [city, state, country[,;]], причем в словах могут быть точки и пробелы - Vashingthon D.C.

Ну таки если нельзя полагаться на текст, то остаётся только пунктуация

https://regex101.com/r/KCVie5/1

Но при таком подходе сплит однозначно лучше регекспа.

Sly32 #:

я уже писал - сплиты не подходят, нужно вычленить только регуляркой. Мой вариант работает, но искал еще варианты

Здесь и вычленяется регуляркой, сплитится уже вычленение.

Из этого вычленения также можно всё достать второй регуляркой вместо сплита. Но одной сделать не получится - текст слишком "неоднородный".

Ну или если мы гарантированно знаем, что "префикс" строки содержит "location.*:", то делать а-ля https://regex101.com/r/LCOGoA/1

Но сплитить группу всё-равно придётся. На условном php

$str = "This role may also be located in our Playa Vista, CA campus.Note: By applying to this position you will have an opportunity to share your preferred working location from the following: Mountain View, CA, USA; Atlanta, GA, USA; Boulder, CO, USA; Chicago, IL, USA; New York, NY, USA; Los Angeles, CA, USA; San Francisco, CA, USA; Washington D.C., DC, USA.
This role may also be located in our Playa Vista, CA campus.Note: Google’s hybrid workplace includes remote and in-office roles. By applying to this position you will have an opportunity to share your preferred working location from the following:In-office locations: San Francisco, CA, USA; Boulder, CO, USA; Los Angeles, CA, USA.Remote location(s): California, USA; Colorado, USA.
Please submit your resume in English - we can only consider applications submitted in this language.
Note: Google’s hybrid workplace includes remote roles
Remote location: Brazil.";
$pattern = "/(location.*?:)([a-zA-Z ,;\.]*)([\.;])/";
$split = array();
if(preg_match_all($pattern, $str, $matches))
  foreach($matches[2] as $val)
    $split = array_merge($split, explode(";", $val));

  print_r($split);
Всего: 356