2016-08-07 3 views
0

У меня есть строка (100*##G. Mobile Dashboard||Android App (Practo.com)||# of new [email protected]@-##G. Mobile Dashboard||Android App (Practo.com)||# of [email protected]@Javascript - разбить строку, указав начальные и конечные символы

Я хочу, чтобы разбить строку таким образом, что он возвращает следующий результат (т.е. он соответствует всем символам, которые начинаются с ## и концами с @@ и разбивает строку с совпавших символов)

["(100*", "G. Mobile Dashboard||Android App (Practo.com)||# of new installs", '-', 'G. Mobile Dashboard||Android App (Practo.com)||# of uninstalls' 
+1

Исходная строка будет иметь дефис между этими 2 символами.Таким образом, при разделении строки с указанными символами, она должна давать дефис в ouput. –

+0

Звучит так же, как вы просто хотите разделить на '##' или '@@'. –

ответ

3

Использование String.prototype.split() Передача регулярных выражений.

var str = "(100*##G. Mobile Dashboard||Android App (Practo.com)||# of new [email protected]@-##G. Mobile Dashboard||Android App (Practo.com)||# of [email protected]@"; 
 

 
var re = /##(.*?)@@/; 
 

 
var result = str.split(re); 
 
console.log(result);

При использовании Capturing parentheses в регулярном выражении, захваченный текст также возвращается в массиве.

Обратите внимание, что это будет иметь окончание "", потому что ваша строка заканчивается @@. Если вы этого не хотите, просто удалите его.


  • Если вы всегда предполагаем, хорошо сформированную строку, следующее регулярное выражение дает тот же результат:

    /##|@@/ 
    

    * Ответил T.J. Crowder

  • Если вы ожидаете новой строки в промежутке между ## и @@, измените выражение на:

    /##([\s\S]*?)@@/ 
    
  • Если вам это нужно, чтобы работать лучше, особенно неудачу быстрее с длинными строками:

    /##([^@]*(?:@[^@]+)*)@@/ 
    

    * Benchmark

+0

Похоже на тот же результат, который вы получите с помощью '/ ## | @@ /', что было бы проще. (Предполагая хорошо сформированную строку.) –

+0

@ T.J.Crowder За исключением случаев, когда у вас есть незамкнутые структуры, например. 'Ааа ## zzz'. Это зависит от того, что вы ожидаете от ввода. – Mariano

+0

Хех, просто добавлял «... предполагая хорошо сформированную строку». :-) –

2

Вы можете сначала расщепляется ##, затем разделить каждый из результатов по @@ и сглаживать результирующий массив, как в следующем.

s.split('##').map(el => el.split('@@')).reduce((acc, curr) => acc.concat(curr)) 

Обратите внимание, что последний элемент результирующего массива будет пустая строка, если исходная строка заканчивается @@, так что вам, возможно, потребуется удалить его, в зависимости от вашего сценария использования.

2

Вы можете использовать:

var s = '(100*##G. Mobile Dashboard||Android App (Practo.com)||# of new [email protected]@-##G. Mobile Dashboard||Android App (Practo.com)||# of [email protected]@' 

var arr = s.split(/(##.*[email protected]@)/).filter(Boolean) 

//=> ["(100*", "##G. Mobile Dashboard||Android App (Practo.com)||# of new [email protected]@", "-", "##G. Mobile Dashboard||Android App (Practo.com)||# of [email protected]@"] 
  • Используйте группу захвата, чтобы получить раздвоение текста в результате массива
  • filter(Boolean) необходимо удалить пустой результат из массива
Смежные вопросы