Регулярное выражение Javascript не может быть разделено

#javascript #regex

#javascript #регулярное выражение

Вопрос:

У меня есть такой текст, как

 <<<<((((sports====1000))))>>>> 
  

или

 <<<<((((sports====1000))))((((librarys====2000))))>>>> 
  

моя проблема в том, что я получаю текст из этого, например

 text[0][0] = 'sports';
text[0][1] = '1000';
text[1][0] = 'library';
text[1][1] = '2000';
  

любая помощь будет принята с благодарностью. Заранее спасибо.

Комментарии:

1. Нужна дополнительная ясность в отношении того, что именно вы хотите?

2. проверьте мой ответ. и скажите мне, работает ли оно!

3. @HashimR Я не могу принять ваши ответы, потому что я сделал не совсем так, но что-то в этом роде. Я хочу более оптимизированное решение. Феликс Клинг, которого я пробовал до сих пор, сначала у меня есть текст внутри <<<<((((текст))))>>>> чем я провел некоторое тестирование, чтобы проверить, является ли это одной строкой или нет, путем тестирования ))))(((( чем яснова разделилось на ====, чем я получил записи. Сачин Шанбхаг Мне нравится извлекать из строк типа <<<<((((sp====1000))))>>>> одна запись или <<<<((((ы====1000))))(((( l====2000))))>>>> множественная запись или <<<<((((libr====))))>>>> некоторые сущности могут быть пустыми, какие бы символы там ни были.

Ответ №1:

Вы можете попытаться разделить все, кроме содержимого, а затем удалить пустые элементы в массиве.

 s="<<<<((((sports====1000))))((((librarys====2000))))>>>>";
s.split(/[<()>=]/).filter(function(ele){if (ele!="") return true});
=> ["sports", "1000", "librarys", "2000"]
  

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

Еще один взлом:

 s="<<<<((((sports====1000))))((((librarys====2000))))((((no_value====))))>>>>";
arr = s.replace("====)","====nil").
  split(/[<()>=]/).
  filter(function(ele){if (ele!="") return true});
var res=[]; 
for(var i = 0; i < arr.length; i =2) { res.push([arr[i],arr[i 1]]); }
res
=> [["sports", "1000"], ["librarys", "2000"], ["no_value", "nil"]]
  

Комментарии:

1. работает только в том случае, если элементы сами по себе не содержат < , > , ( , ) , = . Я предполагаю, что причина, по которой эти разделители повторяются 4 раза, может заключаться в том, чтобы разрешить эти символы (повторяются менее 4 раз) 😉 в данных элемента … помимо этого небольшого возражения, я считаю это отличным решением.

2. В какой-то степени это сработало, но когда извините, что я не упомянул, текст может быть <<<<((((спорт====))))(((( библиотеки====2000))))>>>> означает, что сумма может быть нулевой длячто это не сработало, и я упомянул, что мне нравится иметь это как запись строки, чем будет полезно показать результат также можете ли вы объяснить вторую строку (s.split(/[<()>=]/). фильтр(функция(ele){if (ele!=»») возвращает true});) вашего кода, поскольку я новичок

3. оно может содержать любой элемент. Но количество элементов не будет одинаковым. Как в ‘<<<<((((спорт====1000))))(((( библиотеки====2000))))>>>>’ там не будет ‘<<<<((((спорт=========))))(((( библиотеки====2000))))>>>>’ или ‘<<<<((((спорт========))))((((((((====2000))))>>>>’

4. Я попытался объяснить, как это работает в ответе, но я могу сделать еще одну попытку .split(/[<()>=]/) разбивает строку на массив при каждом вхождении <, (, ) и >. test=»(1)2<3<(» стало бы [«», «1», «2», «3», «», «»]. Затем он удаляет (фильтрует) все элементы в массиве, которые являются пустыми. Это оставляет содержимое. Этот метод не будет работать, если данные не всегда являются ключом = значением. Если есть ключ, но нет значения, он сломается.

5./[<()>=]/ является регулярным выражением. regular-expressions.info/tutorial.html regular-expressions.info/javascript.html

Ответ №2:

регулярное выражение для получения элементов может выглядеть следующим образом:

 ({4}(. ?)={4}(. ?)){4}
  

смотрите этот пример

Комментарии:

1. вы пробовали свое решение? Я пробовал это до того, как он будет жадно искать, когда я подам заявку на <<<<(((спорт====1000))))(((( библиотеки====2000))))>>>> он вернет весь ((((спорт====1000))))(((( библиотеки====2000))))

2. . является жадным, но . ? , как я уже отмечал, неохотно (не жадный). смотрите связанный пример…

Ответ №3:

Попробуйте этот код.

 var test  = "<<<<((((sports=====))))((((====2000))))((((hall====2000))))>>>>";
textAfterSplit1 = test.split(/[(<>)]/);

var myarray = [];

for (i=0; i <(textAfterSplit1.length); i  ){
    textAfterSplit2 = textAfterSplit1[i].split(/[=]/);
    if (textAfterSplit2[0] == null){
        textAfterSplit2[0]= "";
    }
    if (textAfterSplit2[1] == null) {
        textAfterSplit2[1]= ""; 
    }
    myarray.push([textAfterSplit2[0],textAfterSplit2[1]]);
}

document.write(myarray[0][0]);
document.write(myarray[0][1]);
document.write(myarray[1][0]);
document.write(myarray[1][1]);
  

Предполагаемый результат:

 sports2000
  

Оно работает во всех сценариях. Надеюсь, это может помочь. Приветствия!