Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите нубу с регуляркой! (https://javascript.ru/forum/misc/82144-pomogite-nubu-s-regulyarkojj.html)

voraa 20.03.2021 15:55

Помогите нубу с регуляркой!
 
Есть дурацкие строки.
Строка состоит из следующих частей
[<начало>][<табуляции>]<символы>\n
<начало> - последовательность из пробелов, \n, \t (необязат. часть)
<табуляции> - последовательность только из \t (необязат. часть)
<символы> - всякие печатные символы, включая пробел

Нужно удалить часть <начало>.
Т.е.
"строка\n" => "строка\n"
"\n \nстрока\n" => "строка\n"
" \n\t \nстрока\n" => "строка\n"
" \n\t \n\t\tстрока\n" => "\t\tстрока\n"
"\t\tстрока\n" => "\t\tстрока\n"
"\t \t строка\n" => "\t строка\n"

voraa 20.03.2021 16:18

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

рони 20.03.2021 16:32

voraa,
trimLeft() ?

рони 20.03.2021 16:36

voraa,
str = str.replace(/^\s+/mig, '')

ksa 20.03.2021 16:45

voraa, как вариант...

let re=/[\s]{0,2}строка$/;
let str='начало строка';
alert('"'+str.match(re)+'"');

voraa 20.03.2021 16:51

Нет.
Не все так просто. см пост 2
Надо оставить последнюю группу табуляций, которая предшествует символам строки (включая пробелы).
Т.е если есть часть
"\t\t string", то ее оставляем.

Для облегчения задачи можно и \n отбросить. Сам split ом разделю строку по \n

ksa 20.03.2021 16:57

Цитата:

Сообщение от voraa
"\t \t строка\n" => "\t строка\n"

Так ты ранее писал... :)
Так сколько пробелов или табуляций тебе нужно оставлять перед "строка"?

ksa 20.03.2021 16:58

Вот так будут оставлены все пробелы и табуляции
let re=/[\s]*строка$/;
let str='начало       строка';
alert('"'+str.match(re)+'"');

voraa 20.03.2021 17:10

Цитата:

Сообщение от ksa (Сообщение 534792)
Так ты ранее писал... :)
Так сколько пробелов или табуляций тебе нужно оставлять перед "строка"?

Ну если как \s обозначить только пробел,
то
"\t\s\t\sстрока\n" => "\t\sстрока\n"
"\t\s\t\t\sстрока\n" => "\t\t\sстрока\n"
"\t\s\t\t\s\sстрока\n" => "\t\t\s\sстрока\n"

Перед первым печатным символом оставляем все пробелы, а перед ними все табуляции.
(В регулярке под \s подходят и пробелы и \t и \r и \n)

<начало> - последовательность из пробелов, \n, \t (необязат. часть) (пост 1)

ksa 20.03.2021 17:17

Цитата:

Сообщение от voraa
Перед первым печатным символом оставляем все пробелы, а перед ними все табуляции.

Как вариант...

let re=/\t*\s*строка$/;
let str='начало       строка';
alert('"'+str.match(re)+'"');

ksa 20.03.2021 17:18

Цитата:

Сообщение от voraa
Ну если как \s обозначить только пробел

Вместо этого можно указать явно пробельный символ в 16-тиричном счислении или utf-8...

рони 20.03.2021 17:21

voraa,
проверь

str = str.replace(/^\s+?(?=\t+\s+?\S)/mig, '')

voraa 20.03.2021 17:51

рони,
не. Совсем не работает

const r = /^\s+?(?=\t+\s+?\S)/mig
console.log([...'\n\t \n\t\t Журнал'.replace(r, '')])
console.log([...' \t \t\tЖурнал'.replace(r, '')])

Первый вывод дает
[" ", " ", "Ж", "у", "р", "н", "а", "л"]
А должен перед Ж оставить \t\t и пробел
Второй вывод дает
[" ", " ", " ", " ", "Ж", "у", "р", "н", "а", "л"]
А должен перед Ж оставить \t\t

рони 20.03.2021 18:10

voraa,
console.log("\n\t \n\t\t Журнал".replace(/^\s*?(?=\t+\s?\S)/mig, '').replace(/\t/mig, 'T'))
console.log(" \t \t\tЖурнал".replace(/^\s*?(?=\t+\s?\S)/mig, '').replace(/\t/mig, 'T'))
console.log("\t\tЖурнал".replace(/^\s*?(?=\t+\s?\S)/mig, '').replace(/\t/mig, 'T'))
const r = /^\s*?(?=\t+\s?\S)/mig
console.log([...'\n\t \n\t\t Журнал'.replace(r, '')])
console.log([...' \t \t\tЖурнал'.replace(r, '')])

voraa 20.03.2021 18:30

<body>
<pre>
<script>
const rs = /^\s+?(?=\t+\s+?\S)/mig
let s2 = '\n\t \n\t\t Журнал' 
document.writeln(s2.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s3 = '\n\t\n\t\tЖурнал' 
document.writeln(s3.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s4 = ' \t \t\tЖурнал' 
document.writeln(s4.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
</script>
</pre>
</body>


У меня выводит
TSЖурнал
TTЖурнал
TSTTЖурнал

https://drive.google.com/file/d/19ta...F8GPwmNLC/view
Бред какой то.

рони 20.03.2021 18:49

voraa,
#14
TTSЖурнал
TTЖурнал
TTЖурнал

рони 20.03.2021 18:53

voraa,
<pre>
<script>
const rs = /^\s*?(?=\t+[ ]*\S)/mig;
let s2 = '\n\t \n\t\t      Журнал'
document.writeln(s2.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s3 = '\n\t\n\t\tЖурнал'
document.writeln(s3.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s4 = ' \t \t\tЖурнал'
document.writeln(s4.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
</script>
</pre>

voraa 20.03.2021 18:56

Вот я и говорю, что бред.
Пост 14.
Что в форумском варианте, что локально делаю, все равно

TSЖурнал
TTЖурнал
TSTTЖурнал

Хоть в запой уходи.

Не заметил сразу, что исправлено на [ ].
Так вроде работает!
Но еще попроверяю.

рони 20.03.2021 19:04

voraa,
#17 скопируй строку 3, может поможет? )))

voraa 20.03.2021 19:19

рони,
Предыдущие примеры сработали
Дальше опять неудача
Цитата:

Сообщение от voraa
<начало> - последовательность из пробелов, \n, \t (необязат. часть)
<табуляции> - последовательность только из \t (необязат. часть)

Ну нуб я в регулярках
<pre>
<script>
const rs = /^\s+?(?=\t+[ ]*?\S)/mig

let s5 = ' \t \n Журнал' 
document.writeln(s5.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s6 = '\t\tЖурнал' 
document.writeln(s6.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
</script>
</pre>

рони 20.03.2021 19:27

voraa,
:)
<pre>
<script>
const rs = /^\s*?(?=\t+[ \n]*?\S)/mig
let s2 = '\n\t \n\t\t      Журнал'
document.writeln(s2.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s3 = '\n\t\n\t\tЖурнал'
document.writeln(s3.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s4 = ' \t \t\tЖурнал'
document.writeln(s4.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s5 = ' \t \n Журнал'
document.writeln(s5.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s6 = '\t\tЖурнал'
document.writeln(s6.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
</script>
</pre>

voraa 20.03.2021 20:26

Не
5 вариант не идет. Там должно быть SЖурнал
Вроде нормальная проблема.
Есть строковое значение, состоящее из многих строк, разделенных \n
Надо убрать первые пустые строки (если они есть) Пустые - не содержащие ничего, кроме \t и пробелов
А вот со строкой, которая не пустая, не могу понять, как там убирать надо.
Хотел убирать в начале строки все, до последней группы табуляций (если она есть).
А если ее нет, и там одни пробелы, то их вроде как оставить надо.

рони 20.03.2021 21:52

Цитата:

Сообщение от voraa
Там должно быть SЖурнал

:)
<pre>
<script>
const rs = /^\s*?\n?(?=\t*[ ]*\S)/mig;
let s2 = '\n\t \n\t\t      Журнал'
document.writeln(s2.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s3 = '\n\t\n\t\tЖурнал'
document.writeln(s3.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s4 = ' \t \t\tЖурнал'
document.writeln(s4.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s5 = ' \t \n Журнал'
document.writeln(s5.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
let s6 = '\t\tЖурнал'
document.writeln(s6.replace(rs, '').replace(/\t/g, 'T').replace(/\s/g, 'S'))
</script>
</pre>

voraa 20.03.2021 22:26

А я так сделал
<pre>
<script>
const rs = /^(\s*?)(\t*[ ]*\S(.|\n)*)/
let s1 = 'Журнал\n газета' 
document.writeln(s1.replace(rs,'$2').replace(/[ ]/g, 'S').replace(/\t/g, 'T').replace(/\n/g, 'N'))
let s2 = '\n\t \n\t\t Журнал\nгазета' 
document.writeln(s2.replace(rs,'$2').replace(/[ ]/g, 'S').replace(/\t/g, 'T').replace(/\n/g, 'N'))
let s3 = '\n\t\n\t\tЖурнал\n\tгазета' 
document.writeln(s3.replace(rs,'$2').replace(/[ ]/g, 'S').replace(/\t/g, 'T').replace(/\n/g, 'N'))
let s4 = ' \t \n\t  Журнал\n\t\t газета' 
document.writeln(s4.replace(rs,'$2').replace(/[ ]/g, 'S').replace(/\t/g, 'T').replace(/\n/g, 'N'))
let s5 = '\t\tЖурнал\n\t\t газета' 
document.writeln(s5.replace(rs,'$2').replace(/[ ]/g, 'S').replace(/\t/g, 'T').replace(/\n/g, 'N'))
let s6 = '  Журнал\n\t\t газета' 
document.writeln(s6.replace(rs,'$2').replace(/[ ]/g, 'S').replace(/\t/g, 'T').replace(/\n/g, 'N'))
let s7 = '\n\t\n Журнал\n\t\t газета' 
document.writeln(s7.replace(rs,'$2').replace(/[ ]/g, 'S').replace(/\t/g, 'T').replace(/\n/g, 'N'))
</script>
</pre>


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