Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.12.2023, 03:42
Интересующийся
Отправить личное сообщение для accountnujen Посмотреть профиль Найти все сообщения от accountnujen
 
Регистрация: 23.01.2022
Сообщений: 18

Как достать "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
Ответить с цитированием
  #2 (permalink)  
Старый 15.12.2023, 07:03
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

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>
Ответить с цитированием
  #3 (permalink)  
Старый 15.12.2023, 15:43
Интересующийся
Отправить личное сообщение для accountnujen Посмотреть профиль Найти все сообщения от accountnujen
 
Регистрация: 23.01.2022
Сообщений: 18

Сообщение от рони Посмотреть сообщение
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 - тоже может быть. я не уточнил это
Ответить с цитированием
  #4 (permalink)  
Старый 15.12.2023, 16:03
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от 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:10.
Ответить с цитированием
  #5 (permalink)  
Старый 15.12.2023, 16:07
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от accountnujen
folder/goga - тоже может быть. я не уточнил это
Ах ты ж!
Тогда так...

<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>

Последний раз редактировалось ksa, 15.12.2023 в 16:10.
Ответить с цитированием
  #6 (permalink)  
Старый 15.12.2023, 21:52
Аспирант
Отправить личное сообщение для roland Посмотреть профиль Найти все сообщения от roland
 
Регистрация: 02.11.2023
Сообщений: 30

Сообщение от 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 символа.
Ответить с цитированием
  #7 (permalink)  
Старый 15.12.2023, 22:24
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,105

Сообщение от 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>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как достать данные из функции igorz Элементы интерфейса 15 19.09.2014 15:59
Мотоциклисты есть? l-liava-l Оффтопик 13 04.07.2014 13:35
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как достать содержимое между тегами FreeStyler Общие вопросы Javascript 2 23.04.2010 01:08