Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ни дня без регулярки (https://javascript.ru/forum/misc/71287-ni-dnya-bez-regulyarki.html)

Rasy 07.11.2017 15:37

Ни дня без регулярки
 
Для обычного и защищенного соединения нужно убрать "pathname" из строки. Метод split() со всеми вытекающими методами не интересен, но имеет право на жизнь.
Ваши решения. 😺
var url = 'http://sitename.ru/pathname/?search';
url = url.replace(/(http[s]?:\/\/.+\/)(.+)(\?.+)/, '$1$3');
alert(url);

Alexandroppolus 07.11.2017 16:11

Это типа "пятничная задачка", во вторник? ))

var url = 'http://sitename.ru/path/name/?search';
url = url.replace(/^(https?:\/\/[^\/]+\/)[^?#]+/, '$1');
alert(url);

Rasy 07.11.2017 17:05

Цитата:

Сообщение от Alexandroppolus
Это типа "пятничная задачка", во вторник? ))

Возможно.) Я просто имею мало опыта в регулярках)
Решение полезное: логические отрицание, и только с одной ссылкой на одно подвыражение. Разбираюсь почему в подставляемую строку попадает ?search.

Nexus 07.11.2017 17:24

Цитата:

Сообщение от Rasy
Разбираюсь почему в подставляемую строку попадает ?search

Эта часть в паттерн не попала, поэтому затронута не была.

Очень грубо говоря get-параметр тут, как "world" здесь:
'hello world'.replace('hello ','');

Тут это видно: https://regex101.com/r/S3JufM/1

Rasy 07.11.2017 17:53

Цитата:

Сообщение от Nexus
Эта часть в паттерн не попала, поэтому затронута не была.

Т.е. находим первое сопоставление в строке ‒ это http://sitename.ru/pathname/
Найденное соответствие заменяем на возвращенную подстроку http://sitename.ru/ не затрагивая get параметр.
Не затрагиваем его, потому что полное регулярное выражание его не находит.

Цитата:

Сообщение от Nexus
Тут это видно:

Ага, вещь.

Rasy 09.11.2017 00:00

Возникла задача. Нужно найти: первое сопоставление - любой символ до пробела и дефиса, второе - окончание строки после дефиса с пробелом.
Ваше решение.
var str = 'x - Learn x in - y';
str = str.match(/^([^\s-]+)(?:[\s-]+)(.+)$/);
alert(JSON.stringify('1: ' + str[1] + ',  2: ' + str[2]));

Белый шум 09.11.2017 02:37

var str = [' - Learn _ in - 111', 'x - Learn x in - 22', 'xyz - Learn xyz in - 3', '44444'];
for (i in str) {
    s = str[i].match(/^(?:[^\s-]*?)([^\s-])?(?:[\s-]+)(.+)$/);
    s && alert(JSON.stringify('1: ' + s[1] + ',  2: ' + s[2]));
}

Rasy 09.11.2017 12:06

Белый шум,
Да, забыл уточнить. Соответствие повторить один и более раз до первого дефиса.

Белый шум 09.11.2017 12:17

Rasy,
Что именно нужно получить для каждого из входных данных:
[' - Learn _ in - 111', 'x - Learn x in - 22', 'xyz - Learn xyz in - 3', '44444']
??

Rasy 09.11.2017 12:23

Белый шум,
В третьем элементе xyz должен попадать в соответствие под 1-ым индексом.
var str = 'xyz - Learn x in - y';
str = str.match(/^([^\s-]+)(?:[\s-]+)(.+)$/);
alert(JSON.stringify('1: ' + str[1] + ',  2: ' + str[2]));

рони 09.11.2017 12:42

:)
var str = 'xyz - Learn x in - y';
str = str.match(/(.*?)(?: - )(.*)/).slice(1);
alert(JSON.stringify(str));

Rasy 09.11.2017 14:37

рони,
А зачем в группировке экранирован дефис? Он ведь не имеет специальное значение.

рони 09.11.2017 15:00

Rasy,
убрал :)

Alexandroppolus 09.11.2017 15:02

"(?:" и ")" там тоже нафиг не надо :) бесполезная группировка-то

Rasy 09.11.2017 15:11

Цитата:

Сообщение от Alexandroppolus
"(?:" и ")" там тоже нафиг не надо бесполезная группировка-то

Почему? Не жадное повторение, и в поиске пробел и первый дефис мне не нужны:)

рони 09.11.2017 15:13

Цитата:

Сообщение от Alexandroppolus
бесполезная группировка-то

можно код?

Alexandroppolus 09.11.2017 15:16

var str = 'xyz - Learn x in - y';
str = str.match(/(.*?) - (.*)/).slice(1);
alert(JSON.stringify(str));


всё то же самое, только убрал группировку вокруг " - "

Rasy 09.11.2017 15:22

Alexandroppolus,
Классно! Получается " - " более краткая и точная альтернатива классу символов (?:[\s-]), в нашем случае.

рони 09.11.2017 15:23

Alexandroppolus,
спасибо!

Alexandroppolus 09.11.2017 15:28

Rasy,
более точная
как правильнее - зависит от задачи.
/ - / - это если надо строго "тире между пробелами"
/\s-\s/ - тире между любыми "пробельными символами"
/[\s-]+/ - произвольная подстрока из "пробельных символов" и тире

Rasy 09.11.2017 15:31

Alexandroppolus,
:thanks:

Lion777 09.11.2017 22:58

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

включить воду свет
выключить воду
выключить свет

подскажите варианты

Alexandroppolus 09.11.2017 23:35

var str = "не включать нифига включить воду свет выключить воду выключить свет";
var values = str.match(/(?:включить|выключить)\s(?:.(?!включить|выключить))+/g);
alert(values.join('\n'));

рони 10.11.2017 00:14

var str = "не включать нифига включить воду свет выключить воду выключить свет";
var values = str.match(/(включить|выключить).*?(?=включить|выключить|$)/g);
alert(values.join('\n'));

Lion777 10.11.2017 00:44

пасиб ребята, надо регулярки подтянуть мне, с 2009 года не кодил, все настолько забылось, что просто ужас, счас буду разбиратся в ваших регулярках, что к чему...

Rasy 10.11.2017 15:12

рони,
Правильно ли я сформулировал?

Сопоставить слово "включить или выключить" за которым следует произвольный символ, повторяющийся только, если за ним следует слово "включить или выключить", или конец строки.

Alexandroppolus,
Сопоставить слово "включить или выключить" за которым следует пробел, за пробелом следует произвольный символ повторяющийся один и более раз, если только за ним не следут слово "включить или выключить".

Зачем запрет на использование ссылок в группировке? У меня правильно находит и без символов ?:
/(включить|выключить)\s(.(?!включить|выключить))+/g

Alexandroppolus 10.11.2017 15:35

Цитата:

Сообщение от Rasy
Зачем запрет на использование ссылок в группировке?

запрета, конечно же, нет. Не захватывается группа в матчинге. Незначительная экономия. Просто я привык уже )

Цитата:

Сообщение от Rasy
Правильно ли я сформулировал?

насчет моего правильно, а у рони главная фишка в нежадном *
баз вопросика там съело бы всю строку первым совпадением.

Lion777 10.11.2017 17:12

подскажите, почему данная регулярка не будет работать ?
/(?:включить|выключить).+(?!включить|выключить)/gim

сначала проверяем есть ли включить|выключить потом идет любой символ от 1 и больше раза и не должно быть в конце включить|выключить ?

---
Я вообщем из разбора ваших примеров решил так
/(?:включить|выключить)(?:.(?!включить|выключить))+/gim

так как мне может прилететь строка
"Включить воду свет выключить воду выключить включить свет" и тогда выдаст ["выключить воду", "выключить включить свет"]

Rasy 10.11.2017 17:59

Цитата:

Сообщение от Lion777
подскажите, почему данная регулярка не будет работать ?

Повторение жадное.
Цитата:

Сообщение от Alexandroppolus
баз вопросика там съело бы всю строку первым совпадением.


Lion777 10.11.2017 23:38

Ребята, я еще со своим велосипедом )), сегодня вспоминал регулярки и вот такой вопрос по прежнему вопросу.
Есть строка:

"Включить воду свет выключить воду выключить включить свет"

мне надо что-бы не повторялось подряд выключить включить, а учитывалась последняя подстрока "включить|выключить" с данными, решил вот такой регуляркой

var str = "Включить воду свет выключить воду выключить включить свет" ;
var reg = /(?:включить|выключить)\s(?!включить|выключить).+?(?=\sвключить|\sвыключить|$)/gim;
alert(str.match(reg));



Есть получше вариант ? Или это нормально в плане оптимизаци?

рони 11.11.2017 00:20

Цитата:

Сообщение от Lion777
Есть получше вариант ?

Alexandroppolus, пост № 23
var str = "Включить воду свет выключить воду выключить включить свет";
var reg = /(включить|выключить)(?:.(?!включить|выключить))+/gim ;
var values = str.match(reg);
alert(values.join('\n'));

рони 11.11.2017 00:27

Цитата:

Сообщение от Lion777
Я вообщем из разбора ваших примеров решил так
/(?:включить|выключить)(?:.(?!вк лючить|выключить))+/gim

чем не устроил этот вариант?

Lion777 11.11.2017 02:27

Цитата:

Сообщение от рони (Сообщение 469770)
чем не устроил этот вариант?

Я так смотрю, это, наверное, самый оптимальный вариант, тут меньше всего идет проверок...

Lion777 22.11.2017 22:47

есть массив строк

var arrData =
[
"Частота вращения шпинделей (об/мин) 6000",
"Давление, в пневмосистеме, Атм. 6",
"Частота вращения шпинделей (мин) 6000"
];

надо строки разбить, на такие подстроки
"Частота вращения шпинделей" "об/мин" "6000"
"Давление, в пневмосистеме" "Атм." "6"
это тип данные отформатировать для таблицы

var reg = /(.+)(?:\s\((.+)\))|(?:,\s(.+))\s+(\d+)$/; // если так /(.+)(?:\s\((.+)\)|,\s(.+))\s+(\d+)$/ то что-то похожее, но не то получается, одна маска undefined

var arrData = 
[
 "Частота вращения шпинделей (об/мин) 6000",
 "Давление, в пневмосистеме, Атм. 6",
 "Частота вращения шпинделей (мин) 6000"
];

var res = arrData[1].match(reg);

рони 22.11.2017 23:18

Lion777,
<script>
var reg = /^(.*)\s+\(?([^()]+)\)?\s+(\S+)/;

var arrData =
[
 "Частота вращения шпинделей (об/мин) 6000",
 "Давление, в пневмосистеме, Атм. 6",
 "Частота вращения шпинделей (мин) 6000"
];

var res = arrData.map(function(a) {
   return a.match(reg).slice(1)
});
document.write(JSON.stringify(res))
  </script>

Lion777 23.11.2017 01:04

Пасиб рони ), чет игрался регулярками, вроде все логично, на мой взгляд )), а не катит...
Еще вопрос, запятую надо тоже убрать
Давление, в пневмосистеме,
чет думал сделать так "(.*),?\s+" , а оно не катит )

рони 23.11.2017 01:16

Lion777,
<script>
var reg = /^(.*[^,])[,\s]+\(?([^()]+)\)?\s+(\S+)/;

var arrData =
[
 "Частота вращения шпинделей (об/мин) 6000",
 "Давление, в пневмосистеме, Атм. 6",
 "Частота вращения шпинделей (мин) 6000"
];

var res = arrData.map(function(a) {
   return a.match(reg).slice(1)
});
document.write(JSON.stringify(res))
  </script>

рони 23.11.2017 01:40

Lion777,
<script>
var reg = /^(.*[^,\s])[,\s(]+([^()]+)[)\s]+(\S+)/;

var arrData =
[
 "Частота вращения шпинделей (об/мин) 6000",
 "Давление, в пневмосистеме, Атм. 6",
 "Частота вращения шпинделей (мин) 6000"
];

var res = arrData.map(function(a) {
   return a.match(reg).slice(1)
});
document.write(JSON.stringify(res))
  </script>

Lion777 23.11.2017 01:43

Пасиб, чет полностью логику догнать в этих регулярках непросто )), вроде верно пишу, а оно )))... все не то, хоть рядом ))


Часовой пояс GMT +3, время: 12:48.