Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Поиск и замена в переменной (https://javascript.ru/forum/dom-window/70633-poisk-i-zamena-v-peremennojj.html)

dima85 21.09.2017 00:27

Поиск и замена в переменной
 
Есть переменная src:
fgdf
id 35235
hddg
id 45346
rryeh

нужно взять все строги с "id цифры" и заменить их
Я делаю вот так:
src.replace(/(id) [0-9]/gi, '<a href="$1">$2</a>');

$2 не заменяется на найденные цифры. Подскажите, что я делаю не так.

рони 21.09.2017 00:45

dima85,
src.replace(/(id)\s+(\d+)/mg, '<a href="$1">$2</a>')

dima85 21.09.2017 00:48

рони, может есть какой-то просто online сервис который позволяет делать такие конструкции? Ну не могу я сам вникнуть как такое делать.
А вас каждый раз просить тоже не хочется.

j0hnik 21.09.2017 00:54

https://regexr.com/
https://regex101.com/
сервис есть, но надо вникать, у сервиса нет искусственного интеллект, так как Рони он вас не поймет =(

рони 21.09.2017 00:57

dima85,

искать по таблице или запомнить 30 шаблонов и 3 флага
https://javascript.ru/regexp

dima85 21.09.2017 15:06

text text
text
id 34355
text text
id 35235
text
text
id 45346


А replace может удалять вверх? То есть у меня есть переменная с line = "35235" это id 35235 в переменной src код выше.
В src нужно id 35235 удалить и удалить все что до вышестоящей строчки с id *, строчек может быть разное количество. Или такие вещи лучше через функции?

ksa 21.09.2017 16:08

Цитата:

Сообщение от dima85
А replace может удалять вверх?

Работает только с найденой подстрокой. За ее пределами действия не производятся. :no:

Цитата:

Сообщение от dima85
Или такие вещи лучше через функции?

У метода replace есть калбек-функция...

Может тебе лучше пример привести на предмет "так было", "потом стало"... :)
Т.к. у тебя нет в строке
Цитата:

Сообщение от dima85
line = "35235"


dima85 21.09.2017 17:12

В переменной line нет слова id

Примеры, целая src
text text
text
id 34355
text text
id 35235
text
text
id 45346


Если line = "35235" то удаляем 4-5 строчки, получаем это:
text text
text
id 34355
text
text
id 45346



если line = "45346" то удаляем 6,7,8 строки, получаем:
text text
text
id 34355
text text
id 35235

рони 21.09.2017 17:34

dima85,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>


</head>

<body>
<textarea id="h" name=""  rows="12" >text text
text
id 34355
text text
id 35235
text
text
id 45346

</textarea>
 <script>

var line = "35235", reg = new RegExp("((id)\\s+(\\d+))[^\\d]+?"+line, "mig");

h.value = h.value.replace(reg, "$1")
  </script>
<textarea id="k" name=""  rows="12" >text text
text
id 34355
text text
id 35235
text
text
id 45346

</textarea>
 <script>

var line = "45346", reg = new RegExp("((id)\\s+(\\d+))[^\\d]+?"+line, "mig");

k.value = k.value.replace(reg, "$1")
  </script>




</body>
</html>

Rasy 21.09.2017 17:44

Цитата:

Сообщение от dima85
Если line = "35235" то удаляем 4-5 строчки, получаем это:

Простой вариант. Пока набиваю руку в регулярках

var str = `text text
text
id 34355
text text
id 35235
text
text
id 45346`;
str = str.replace(/(id\s{1}\d+)(\D+id\s{1}35235\s)([a-zA-Z0-9\n\s]+)/im, '$1\n$3');
alert(str);

ksa 22.09.2017 08:21

Цитата:

Сообщение от Rasy
Пока набиваю руку в регулярках
\s{1}

Явно перебор...

ksa 22.09.2017 10:05

Цитата:

Сообщение от Rasy (Сообщение 465092)
Простой вариант. Пока набиваю руку в регулярках

var str = `text text
text
id 34355
text text
id 35235
text
text
id 45346`;
str = str.replace(/(id\s{1}\d+)(\D+id\s{1}35235\s)([a-zA-Z0-9\n\s]+)/im, '$1\n$3');
alert(str);

Предложу такой вариант...
var str = `text text
text
id 34355
text text
id 35235
text
text
id 45346`;
str = str.replace(/(id\s\d+)[\S\s]*?id\s35235/img, '$1');
alert(str);

Rasy 22.09.2017 10:29

ksa,
:thanks:

рони 22.09.2017 11:15

ksa,
:nono: где text text
id 35235
?
var str = `text text
text
id 34355
text text
id 35235
text
text
id 45346`;
str = str.replace(/(id\s\d+)[\S\s]*?id\s45346/img, '$1');
alert(str);

ksa 22.09.2017 13:43

Цитата:

Сообщение от рони
где text text
id 35235
?

Так ведь их нужно удалять по условию задачи... :blink:

ksa 22.09.2017 13:44

Цитата:

Сообщение от dima85 (Сообщение 465088)
Примеры, целая src
text text
text
id 34355
text text
id 35235
text
text
id 45346


Если line = "35235" то удаляем 4-5 строчки, получаем это:
text text
text
id 34355
text
text
id 45346

Вроде все как нужно...

рони 22.09.2017 13:53

ksa,
line это переменная смотри пост №8 самый нижний пример и пост №14

dima85 22.09.2017 20:28

var line = "45346", reg = new RegExp("((id)\\s+(\\d+))[^\\d]+?"+line, "mig");
	k.value = k.value.replace(reg, "$1")


Помогите пожалуйста разобрать эти строчки
(id)\ - наше слово id
\s+ любое количество пробелов
(\\d+) - любые цифры
((id)\\s+(\\d+)) - то есть ищем до вышетоящего id с пробелом и цифрами.

[^\\d] - не понимаю, какие-то цифры. А где id?
"mig" - тоже не понимаю.

рони 22.09.2017 20:42

Цитата:

Сообщение от dima85
[^\\d] - не понимаю, какие-то цифры

всё что не числа
Цитата:

Сообщение от dima85
"mig" - тоже не понимаю.

вам ссылку давали
Цитата:

Сообщение от рони
и 3 флага

Цитата:

g — глобальный поиск (обрабатываются все совпадения с шаблоном поиска);
•i — не различать строчные и заглавные буквы;
•m — многострочный поиск.

рони 22.09.2017 20:43

Цитата:

Сообщение от dima85
то есть ищем до от вышетоящего id с пробелом и цифрами.

:write:

dima85 22.09.2017 22:55

src может быть и таким:
text t55ext
text gd6!333 43
id 395

text text
text gd!333 43
id 34355

text te>xt = 34
text= <44
id 45346

То есть там могут быть не только буквы но и цифры и спец символы и enter.

Попробовал сделать вот так:
var line = "45346", reg = new RegExp("((id)\\s+(\\d+))[^\]+?id "+line, "mig");
k.value = k.value.replace(reg, "$1")

Но удаляются и лишние строки.

рони 23.09.2017 00:05

dima85,
<textarea id="k" name=""  rows="12" >
text t55ext
text gd6!333 43
id 395

text text
text gd!333 43
id 34355

text te>xt = 34
text= <44
id 45346


</textarea>
 <script>

var line = "45346", reg = new RegExp("([\\s\\S]+?)(id\\s+\\d+)", "mig");

k.value = k.value.replace(reg, function(a,b,c) {

return new RegExp("^id+\\s+"+line+"$").test(c) ? ""  : a
})
  </script>

Rasy 23.09.2017 11:36

Цитата:

Сообщение от dima85
[^\\d] - не понимаю, какие-то цифры

Цитата:

Сообщение от рони (Сообщение 465176)
всё что не числа

Разве? Зачем ты экранируешь классы символов?
var str = 'ab25sz';
console.log(str.match(/[^\d]/g)); // все что не числа
console.log(str.match(/[^\\d]/g)); // все совпадения

Rasy 23.09.2017 11:52

Вопрос снят. Не заметил сразу определение через конструктор.

ksa 25.09.2017 09:03

Цитата:

Сообщение от рони
line это переменная

Я это понял... :yes:
Просто не использовал
new RegExp()

поленился.
Написал значение той переменной литерально. Пусть автор сам дальше реализовывает. :)

рони 25.09.2017 09:11

Цитата:

Сообщение от ksa
Пусть автор сам дальше реализовывает

дело не в переменной, а в алгоритме который не верно отрабатывает...


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