2013-01-08 4 views
1

Я пытаюсь использовать RegEx Javascript для анализа каждого вопроса из данного параграфа. Тем не менее, я получаю нежелательные результаты:Захват всех вопросов из абзаца

Javascript

regex = /(\S.+?[.!?])(?=\s+|$)/g; 
result = regex.exec("I can see you. Where are you? I am here! How did you get there?"); 

Ожидаемый результат

["Where are you?", "How did you get there?"] 

Фактический результат

["I can see you.", "I can see you."] 

PS: Если есть лучший способ сделать это, я все уши!

ответ

2

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

var x = string.match(/\(?[A-Z][^\.!\?]+[!\.\?]\)?/g); 
x.filter(function(sentence) { 
    return sentence.indexOf('?') >= 0; 
}) 
+0

Wow, Я думаю, что это трюк! Спасибо огромное! – simonwjackson

+0

Приветствую вас, по какой-то причине вы переключили ответы? Функционально тот же самый афайк, хотя новый - немного более короткое регулярное выражение. – 7zark7

+0

Ваш фильтр в сочетании с более коротким регулярным выражением - это то, что я нашел лучшим методом. Хотелось бы, чтобы я выбрал оба лучшего :) – simonwjackson

1

Метод опции JavaScript регулярных выражений .exec возвращает только первый матч с захватами. Он также обновляет объект регулярного выражения с положением в строке совпадения. Это позволяет вам перебирать строку с помощью метода .exec (и почему вы получаете только первое совпадение).

Попробуйте использовать .match метод строкового объекта вместо:

regex = /(\S.+?[.!?])(?=\s+|$)/g; 
result = ("I can see you. Where are you? I am here! How did you get there?").match(regex); 

Это дает ожидаемый результат:

[ 
    "I can see you.", 
    "Where are you?", 
    "I am here!", 
    "How did you get there?" 
] 
1
regex =/?([^.!]*)\?/g; 
text = "I can see you. Where are you? I am here! How did you get there?"; 
result = []; 
while (m = regex.exec(text)) { 
    result.push(m[1]) 
} 

Выход:

[ 'Where are you?', 
    'How did you get there?' ] 
Смежные вопросы