2010-10-28 8 views
0

Я хочу взять строки, как:Javascript RegEx Помощь

  • Отправить Изменения
  • Создать
  • Record Update
  • Сохранить Item

и конвертировать их в:

  • Под- mitting Изменения
  • Создание нового
  • Обновление записи
  • Сохранение предмета

с функцией, как:

var ConvertToProgressivePresent = (function(){ 
    // cache this regex 
    var rProgressivePresent = /\b(?:(Submi(t))|(Creat|Sav|Updat)e)\b/i; 
    return function(phrase){ 
     return phrase.replace(rProgressivePresent, "$1$2$3ing"); 
    }; 
}()); 

Это выше регулярных выражений работает, но не кажется, что лучший способ сделать Это. Мне не нравится группировка здесь, где 1-2 группы всегда пусты, когда есть совпадение.

Есть предложения или улучшения?

+0

Regex не является единственным инструментом. Компьютеры тоже делают что-то другое. Почему так много людей переходят к регулярному выражению для любых манипуляций с строкой? (Это не нацелено на вас конкретно, я видел слишком много таких вопросов в последнее время. Хотя в этом случае regex, вероятно, не лучший выбор.) – JoshD

+0

Regex - это ответ на все миры, разве вы не знаете ? Ну, все, кроме анализа HTML, видимо. Очевидно, что HTML должен быть уничтожен. – MooGoo

+0

Потому что это гораздо веселее. Потому что это сложно. Потому что он позволяет использовать сжатый (хотя и менее управляемый) код. :-) –

ответ

1

Я думаю, что вы должны скорее использовать записи CASE. Regex - это не самый эффективный способ делать что-то ... и это, вероятно, лучше всего, если вы не знаете, что такое старая поговорка.

Ничего себе, я эту проблему ... Я знаю, я буду использовать регулярное выражение ... хорошо, теперь у вас есть две проблемы 90)

+0

I второй это.Будет гораздо проще добавить дополнительный аргумент case, чем взломать его в регулярном выражении. – skazhy

+0

Хм, можете ли вы продемонстрировать хороший способ сделать это с помощью 'switch' /' case'? 'if-else-if' кажется, что для этого лучше, чем' case'. –

+0

Я на самом деле не парень из java, но не мог бы ты сделать это как этот? http://stackoverflow.com/questions/3290550/javascript-switch-case – Keng

0

Во-первых, это не кажется что ваше регулярное выражение делает все, что вы хотите, так как я не вижу второго «t», добавляемого при изменении представления на отправку.

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

function ReplaceIfBeginsWith(wholeString, checkFor, replaceWith) 
{ 
    if (wholeString.indexOf(checkFor + ' ') == 0) 
    { 
     return replaceWith + ' ' + wholeString.substr(checkFor.length + 1); 
    } 
    if (wholeString == checkFor) 
    { 
     return replaceWith; 
    } 
    return wholeString; 
} 

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

+0

Не совсем правильный подход для моего дела. Спасибо хоть. –

+0

Второй «t» добавляется, BTW. –

2

Если у вас есть конкретные слова для замены, тогда вы можете сделать слово банк. Запишите слова и их замену в объект, а затем пропустите его.

var ConvertToProgressivePresent = (function() { 
    var replaceValues = { 
     "Submit": "Submitting", 
     "Create": "Creating", 
     "Update": "Updating", 
     "Save": "Saving" 
    } 
    return function(phrase) { 
     for (var item in replaceValues) { 
      phrase = phrase.replace(item, replaceValues[item]); 
     } 
     return phrase; 
    }; 
}()); 

Вот JSFiddle Example

+0

Красиво сделано. Я бы, вероятно, использовал массивы вместо хэша. Теперь, как бы вы относились к нечувствительности к регистру; неужели вы не добавили бы больше слов в банк? –

+0

Это нечувствительная к регистру запись http://www.jsfiddle.net/subhaze/aVnhH/3/ – subhaze

+0

Cool. Но что происходит со строкой «Отправить свое обновление»? Он должен только изменить ПЕРВЫЙ матч. –