2015-03-07 3 views
-1

Для Regex поклонников ... Что у меня есть эта строка:Regex строки с рисунком

"Lorem ipsum dolor FOO IO BAR BA" 

Я хотел бы, чтобы извлечь Заголовок, и массив из ЗАГЛАВНЫХ суффиксов:

  1. "Lorem ipsum dolor"
  2. ["FOO", "IO", "BAR", "BA"]

Вот моя попытка:

function retrieveGroups(string) 
{ 
    var regexp = new RegExp(/(FOO|BAR|BA|IO)/g);  
    var groups = string.match(regexp) || []; 
    var title = string.replace(regexp, ""); 
    return {title:title, groups:groups}; 
} 

приводит:

title : "Lorem ipsum dolor ", 
groups : ["FOO" , "IO", "BAR", "BA"] 

, который является большим, но это не будет препятствовать это случаи:

LoremFOO ipBAsum IO dolor FOO 

где в КАН мне нужно только ["FOO"] в итоговой группе.

Правило кажется просто ...

Получить титул.
Название может быть прописным («LOREM IPSUM»).
Получить массив суффиксов верхнего регистра.
В этой строке могут отсутствовать Grouops (FOO, BAR, IO, BA).
Не соответствует суффикс, если это не так: суффикс и не ведут по пробельные
Начало соответствие с конца строки (если это возможно?), Так что не соответствуют дублировать параметры группы, если встречаются (пример выпуска выше)

Я также попытался string.replace(regexp, function(val) ...., но я не знаю, как это могло бы помочь ...

не знаю, если это помогает, но fiddle is here. Спасибо!

+0

Почему вы не хотите, чтобы соответствовать 'IO'? –

+0

, потому что это не суффикс (так как после него есть текст) и может быть, вероятно, частью названия. (Мне нужно свести к минимуму ошибки) – Ginnani

+0

Я думаю, что вы не хотите, чтобы часть заголовка ... –

ответ

2

Может быть, это то, что вы ищете:

function retrieveGroups(string) 
{ 
    var regexp = new RegExp(/^(.*?)\s*([ A-Z]+)*$/);  
    var result = string.match(regexp) || []; 
    var title = result[1]; 
    var groups=result[2].split(" "); 
    return {title:title, groups:groups}; 
} 

Edit: Здесь решение для фиксированного набора Прописные слов:

function retrieveGroups(string) 
{ 
    var regexp = new RegExp(/^(.*?)\s*((?:\s|FOO|BAR|IO|BA)+)?$/);  
    var result = string.match(regexp) || []; 
    var title = result[1]; 
    var groups=result[2].split(" "); 
    return {title:title, groups:groups}; 
} 
+0

Выглядит многообещающе, так как я вижу использование 's *' и '* $'. Позвольте мне проверить это! P.S пока я проверяю как примечание стороны, я хотел бы избежать заголовка верхнего регистра, который будет соответствовать в массиве результатов ... это возможно? (именно поэтому я использовал группу с точными совпадениями «BAR IO FOO BA») – Ginnani

+1

Когда вы знаете, какие слова верхнего уровня могут быть в группах, вы можете использовать это регулярное выражение: '/^(.*?)\s* (?: \ s * (FOO | BAR | BAZ)) * $/' –

+0

да, я точно знаю, какие параметры суффикса. только 4 из них FOO BAR IO BA. Можете ли вы обновить yoru? Кажется, действительно круто regex в вашем комментарии ... – Ginnani

3

Чтобы получить массив суффиксов верхнего регистра.

> "Lorem ipsum dolor FOO IO BAR BA".match(/\b[A-Z]+\b(?!\s+\S*[^A-Z\s]\S*)/g) 
[ 'FOO', 
    'IO', 
    'BAR', 
    'BA' ] 
> "LoremFOO ipBAsum IO dolor FOO".match(/\b[A-Z]+\b(?!\s+\S*[^A-Z\s]\S*)/g) 
[ 'FOO' ] 

Чтобы получить заголовок массива.

> "LoremFOO ipBAsum IO dolor FOO".match(/^.*?(?=\s*\b[A-Z]+\b(?:\s+[A-Z]+\b|$))/g) 
[ 'LoremFOO ipBAsum IO dolor' ] 
> "Lorem ipsum dolor FOO IO BAR BA".match(/^.*?(?=\s*\b[A-Z]+\b(?:\s+[A-Z]+\b|$))/g) 
[ 'Lorem ipsum dolor' ] 

Update:

> "LoremFOO ipBAsum IO dolor FOO".match(/\b(?:FOO|BAR|BA|IO)\b(?!\s+\S*[^A-Z\s]\S*)/g) 
[ 'FOO' ] 
  • \b называется границей слова, которое соответствует между характером слова и без слов характер.
  • (?:FOO|BAR|BA|IO)\b матчи FOO или BAR или BA или IO, а также следующие граничные слова,

  • (?!\s+\S*[^A-Z\s]\S*) только если это не следует один или более символ пробела, ноль или более символов без пробелов и характера, кроме пробел или заглавную букву, за которой следуют ноль или более непространственных символов. Таким образом, это не подходит для IO, потому что за ним следует слово, которое содержит по крайней мере одну строчную букву. (?!...) называется отрицательным прогнозом.


> "Lorem ipsum dolor FOO IO BAR BA".match(/\b(?:FOO|BAR|BA|IO)\b(?!\s+\S*[^A-Z\s]\S*)/g) 
[ 'FOO', 
    'IO', 
    'BAR', 
    'BA' ] 

А также, вы можете использовать положительное регулярное выражение на основе опережения также. (?=....) называется положительным утверждением.

> "LoremFOO ipBAsum IO dolor FOO".match(/\b(?:FOO|BAR|BA|IO)\b(?=\s+(?:FOO|BAR|BA|IO)\b|$)/g) 
[ 'FOO' ] 

Чтобы получить название массива.

> "Lorem ipsum dolor FOO IO BAR BA".match(/^.*?(?=\s*\b(?:FOO|BAR|BA|IO)\b(?:\s+(?:FOO|BAR|BA|IO)\b|$))/g) 
[ 'Lorem ipsum dolor' ] 
> "LoremFOO ipBAsum IO dolor FOO".match(/^.*?(?=\s*\b(?:FOO|BAR|BA|IO)\b(?:\s+(?:FOO|BAR|BA|IO)\b|$))/g) 
[ 'LoremFOO ipBAsum IO dolor' ] 
+0

Ницца! Не могли бы вы объяснить, как вам удалось не соответствовать «IO» в последнем примере? Просто вопрос, если я могу ... что, если у меня есть только заголовок (все в верхнем регистре), но нет соответствующих правил (FOO IO BAR BA), будет ли титул улавливаться в матче? Этого я бы хотел избежать (поэтому я использовал группы с предопределенными MATCHES) thx для ответа – Ginnani

+0

Я не могу понять ваш вопрос. –

+0

Ой, извините, да, скажем, строка точно такая: «LOREM IPSUM». суффиксов нет. Я думаю, что ваш пример будет тянуть IPSUM как суффикс, но это не так. Суффиксом может быть только FOO BAR IO BA – Ginnani

2

С помощью Авинаш-х RegEx можно извлечь все допустимые суффиксы. Название будет всем текстом перед первым суффиксом. Таким образом, окончательный код JavaScript будет выглядеть, как показано ниже:

var arr = ['Lorem ipsum dolor FOO IO BAR BA', 'LoremFOO ipBAsum IO dolor FOO'] 
 

 
arr.forEach(function(str) { 
 
    var o = retrieveGroups(str); 
 
    alert("Parsed title = " + o.title + ", groups=" + o.groups); 
 
}); 
 

 
function retrieveGroups(string) { 
 
    var regex = /\b(?:FOO|BAR|BA|IO)\b(?=\s+(?:FOO|BAR|BA|IO)\b|$)/g 
 
    var groups = string.match(regex) || []; 
 
    var title = string.replace(regex, '').trim(); 
 
    return {'title':title, 'groups':groups}; 
 
}

Вот DEMO

+0

Спасибо, я дал ему также голосование за регулярное выражение. Его регулярное выражение выбирает только те суффиксы, за которыми следует суффикс или входной конец. Довольно просто и аккуратно. – MaxZoom

+0

Да, если вы обратитесь к ответу Торбена, хотя вы и Авинаш дали мне хороший урок в Regexpezz !! Приветствуется и благодарен. Спасибо, ребята! – Ginnani