2017-02-18 7 views
0

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

Входная строка Please choose one \n 1. optionA \n 2. optionB \n 3. optionC

Please choose one can be any text может иметь любой текст на своем месте. Из этого \n до end of line будет иметь тот же формат, что и интервал. optionA, optionB и optionC являются динамическими.

Я хочу нажать optionA, optionB и optionC в массив. Я пробовал это с помощью Regex и Javascript, но не был успешным. Как мне это сделать?

Я использовал _.words от lodash и regex /\.(.*)\\/. Прежде всего, регулярное выражение не возвращает слово

Помоги мне

+1

Можете ли вы показать нам, что вы пробовали до сих пор, и как он не работает? Затем мы можем направить вас в правильном направлении, чтобы зафиксировать его. – qxz

+0

. Ваше регулярное выражение, похоже, ищет буквенный символ обратной косой черты; возможно, вы хотели искать новую строку '\ n'? – qxz

ответ

1

Проверьте это. Он будет работать только для текста в формате, указанном в ваших вопросах.
Поскольку не совсем понятно, используете ли вы разные строки или нет, я даю вам это решение.
Если вы сделаете это, оставить комментарий

var str="This can be any string ending with\n 1. any_option \n 2. can_be_placed \n 3. without_space"; 
 
var opt=str.replace(/^[^\n]*\n\s?\d+.\s?/g,''); 
 
opt=opt.replace(/\s?\n\s?\d+.\s?/g,',').split(','); 
 
console.log(opt);

+0

не работает, если какой-либо из пронумерованных опций имеет в них запятые –

+0

да. Но в целом значения параметров не содержали запятых @AndrewWillems –

+1

OP пишет: «Опция« optionA »,« optionB »и« optionC »являются динамическими». который подсказывает мне, что можно встретить обычную английскую метку препинания, такую ​​как запятая. –

0

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

var inputString = 'Please choose one\n 1. option_1 \n 2. option_2 \n 3. option_2'; 
 
var matchedList = inputString.match(/\b\w*[_]\w*\b/g); 
 
console.log(matchedList);

Выходной matchedList массив

[ "option_1", "option_2", "option_2"]

+0

, но он не будет соответствовать опции без подчеркивания. Он говорит, что option_1 может быть чем угодно. –

1

Раствор с помощью Array.prototype.match() и Array.prototype.map() функции:

var s = 'Please choose one \n 1. optionA \n 2. optionB \n 3. optionC', 
 
    options = s.match(/\n \d+\. (\w+)/g).map(function(v){ 
 
     return v.trim().split(' ')[1]; 
 
    }); 
 

 
console.log(options);

1

Я предложил бы использовать split:

var input = 'Please choose one \n 1. optionA \n 2. optionB \n 3. optionC'; 
 
var options = input.split(/\s*?\n\s*\d+\.\s*/).slice(1); 
 
console.log(options);

+0

Я считаю, что исходный '/ s *?' Должен быть просто '/ s *'. –

+1

Да, это может быть опущено, но я думаю, что это более эффективно с временем?', так как он не будет пытаться включить' \ n', который следует в первой попытке, но без '?' он сначала захватит '\ n' в' \ s * ', только чтобы обнаружить, что не дает матч: он должен отступить, а затем сделать это правильно. – trincot

+0

Как не-жадное совпадение нуля или более чего-либо в начале регулярного выражения возвращает что-нибудь? Он четко работает, потому что ваше решение устраняет пробелы перед '\ n'. Но если нуль чего-то есть вариант, и вам говорят, что он не жадный, почему вы берете что-нибудь? –