Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как достать "folder" и "asd/asd" из "\folder/asd\asd/" (https://javascript.ru/forum/misc/85667-kak-dostat-folder-i-asd-asd-iz-%5Cfolder-asd%5Casd.html)

accountnujen 15.12.2023 03:42

Как достать "folder" и "asd/asd" из "\folder/asd\asd/"
 
Пользователь вбивает в input адрес. Он может написать
\folder/asd\asd/
\folder\asd\asd\
folder/asd/asd
folder/asd\asd

Мне нужно достать первое значение - т.е. "folder" и всё, что идёт после слеша, т.е. в данном случае, "asd/asd". Слеши могут быть и прямые и обратные, и те и другие вместе. Если разделить ещё можно через .split(/[\/\\]/), то вот с удалением слешей - сложности.

chatgpt предложил вот такой вариант
path = input.value.replace(/^\/+|\/+$/g, '');
но на выходе я получаю '\\folder/asd\\asd'

Может быть вы предложите более простой вариант, даже и не со split

рони 15.12.2023 07:03

accountnujen,
введите образец в input .
<body>
    <input id="tx" name="">
    <output id="out">
<script>

tx.oninput = function() {
   let match = this.value.match(/([^\x5c\x2F]+)[\x5c\x2F]([^\x5c\x2F]+[\x5c\x2F][^\x5c\x2F]+)/)
   if(match) out.textContent = match.splice(1);
}

</script>
</body>

accountnujen 15.12.2023 15:43

Цитата:

Сообщение от рони (Сообщение 554258)
accountnujen,
введите образец в input .
<body>
    <input id="tx" name="">
    <output id="out">
<script>

tx.oninput = function() {
   let match = this.value.match(/([^\x5c\x2F]+)[\x5c\x2F]([^\x5c\x2F]+[\x5c\x2F][^\x5c\x2F]+)/)
   if(match) out.textContent = match.splice(1);
}

</script>
</body>

folder/goga - тоже может быть. я не уточнил это

ksa 15.12.2023 16:03

Цитата:

Сообщение от accountnujen
Мне нужно достать первое значение - т.е. "folder" и всё, что идёт после слеша, т.е. в данном случае, "asd/asd"

Такой вот вариант...

<textarea>\folder/asd\asd/
\folder\asd\asd\
folder/asd/asd
folder/asd\asd</textarea>


 
<script>
let s = document.querySelector('textarea').value
const a = s.split('\n')
const re = /(?<=^[\\\/]?)(\w+)[\\\/](\w+[\\\/]\w+)(?=[\\\/]?$)/
s = a.map(v => v.match(re).slice(1))
alert(JSON.stringify(s, null, 2))
 
</script>

ksa 15.12.2023 16:07

Цитата:

Сообщение от accountnujen
folder/goga - тоже может быть. я не уточнил это

Ах ты ж! :-E
Тогда так...

<textarea>\folder/asd\asd/
\folder\asd\asd\
folder/asd/asd
folder/asd\asd
folder/goga</textarea>


 
<script>
let s = document.querySelector('textarea').value
const a = s.split('\n')
const re = /(?<=^[\\\/]?)(\w+)[\\\/](\w+([\\\/]\w+)?)(?=[\\\/]?$)/
s = a.map(v => v.match(re).slice(1, 3))
alert(JSON.stringify(s, null, 2))
 
</script>

roland 15.12.2023 21:52

Цитата:

Сообщение от accountnujen
Может быть вы предложите более простой вариант, даже и не со split

Чтобы не строить хрустальные замки из RegExp, можно сделать так:

// обратный слеш в строках массива экранирован
const a = [
    "\\folder/asd\\asd/",
    "\\folder\\asdasd\\",
    "folder/asd/asd",
    "folder/asd\\asd"
]

a.map(s => {
    s = s.replace(/^\W+|\W+$/g, '') // убираем лишнее с начала и с конца строки
    const i = s.search(/\W/) // ищем первый разделитель
    return ~i ? [s.slice(0, i), s.slice(i + 1)] : [s] // если разделитель найден, добавляем в массив первую и вторую часть, если не найден, добавляем всю запись
})

Что делать с возвращаемым результатом колбэк-функции Array.map - решать Вам. Принцип, думаю, понятен. С условием, что разделитель состоит из 1 символа.

рони 15.12.2023 22:24

Цитата:

Сообщение от accountnujen
folder/goga - тоже может быть.

accountnujen,
введите образец в input .
<body>
    <input id="tx" name="">
    <output id="out">
<script>

tx.oninput = function() {
   let match = this.value.match(/([^\x5c\x2F]+)[\x5c\x2F]+(.*?)(?=[\x5c\x2F]*?$)/)
   if(match) out.textContent = match.splice(1);
}

</script>


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