2013-06-11 2 views
2

У меня есть несколько сигнальных флагов в сериализованной строке, и мне нужно удалить флаг из строки, когда пользователь запрашивает определенную операцию. Мне не удалось найти регулярное выражение, которое работает во всех случаях для строки ниже.RegExp заменить подстроку в JavaScript

var flags = "out:ab,bc,bcc,cd"; 

Это ближайший я получил (например, удаление флага Ьс)

flags.replace(/[:,]bc\b/, ""); 

Результат out:ab,bcc,cd это круто, но при удалении аЬ я буду получать outbc,bcc,cd, что неправильно. Результат всегда должен содержать строку, сериализованную, например. out:flag1,flag2 Я попытался захватить подшаблоны, но не смог найти всестороннюю рабочую комбо.

- подробнее:

Флаги 0/1 сигналы, если флаг, я должен удалить его.

Out: это рабочий режим, и это противоположность In: (это вторая группа флагов). Проще говоря, Out: это «разрешить все, но« черный список », где In:« отрицает все, но присваивает белый список этим ». Приложение может работать в любом режиме. ab, bc, cd ... являются образцовыми алфавитными клавишами.

+0

Так что же такое «флаги»? Что такое «выход»? Каков ожидаемый результат? Это немного прояснит ситуацию. – elclanrs

+0

Если вы хотите что-то совместить, но не заменяете его, используйте [lookaround] (http://www.regular-expressions.info/lookaround.html) – Barmar

+0

@elclanrs Я добавил больше информации, надеюсь, что теперь это яснее. Barmar Мне нужно удалить флаг, а не просто совместить :) –

ответ

2

non-capturing parentheses Использование:

var q = ['cd', 'bc'].join('|'), 
    re = new RegExp('(?:[:]('+q+'))|(,('+q+')(?=,))|(,('+q+')$)', 'g'), 
    flags = "out:ab,bc,bcc,cd"; 
flags.replace(re, ''); 
=> "out:ab,bcc" 

От MDN-х Regular Expressions:

(? Х) Совпадает с 'х', но не помнит матч. Скобки называются скопированными скобками, и вы можете определить подвыражения для операторов регулярных выражений для работы. Рассмотрим примерное выражение/(: foo) {1,2} /. Без скопированных скобок символы {1,2} будут применяться только к последнему «o» в «foo». В скобках скобки {1,2} применяется ко всему слову 'foo'.


Edit: Объяснение RegExp

/(?:[:](cd|bc))|(,(cd|bc)(?=,))|(,(cd|bc)$)/g 

Есть три секции, разделенные трубы. ?:[:](cd|bc) охватывает флаги сразу после точки с запятой; ,(cd|bc)(?=,) покрывает флаги между запятыми, включая предыдущую запятую в согласованном выражении; ,(cd|bc)$ охватывает флаги в конце строки, также включая предыдущую запятую.


Edit 2:

Fixed RegExp, замените q с флагами, которые вы хотите, чтобы соответствовать.

+0

Hm удаление 'ab' все еще удаляет': ' –

+0

Я думаю, что получил его:'/(?: \ Bab \ b (?:,)?) | (аЬ (?=,)) | (, ab $)/g' Я изменил первый раздел и удалил OR, так как нет никакого варианта использования, который потребовал бы удалить два или более за раз. –

+1

Кроме того, '/ ((?: ab | bcc | cd),) | (, (?: ab | bcc | cd) (? =,)) | (,? (?: ab | bcc | cd) $)/g' -> http://jsfiddle.net/dXtDu/ – benastan

Смежные вопросы