2015-08-05 6 views
0

Я прошел через множество вопросов и не смог решить свою проблему.Regex - совпадение персонажа только один раз - затем игнорировать

Мне нужно совместить ряд специальных символов, но только один раз.

HTML:

<form class="FillIn Rearrange"> 
     <input data-correctanswer="ça" type="text">, 
     <input data-correctanswer="ça" type="text"> 
     <input data-correctanswer="vé" type="text"> 
     <input data-correctanswer="bién" type="text"> 
</form> 

Этот JS в настоящее время возвращает ВСЕ С и Е, но мне нужно 1 макс. каждый из них:

var buttons = ''; 
     $('.FillIn input').each(function() { 
      var corrAns = $(this).attr('data-correctanswer'); 


      for (var i = 0; i < corrAns.length; i++) { 
       if (corrAns[i].match(/[éç]/g)) { 
        buttons += '<button>' + corrAns[i] + '</button>'; 
       } 
      } 
     }); 

fiddle

В настоящее время возвращает сЦВЕ (все вхождения)

нужно его вернуть Ce (один из каждого).

нужно масштабируемое решение, т.е. .match (/ [éçdfga]/г) (или любое дополнительное письмо)

+0

Я хотя удаления г бы это сделать, но это не делает (/ [Ес]/г ->/[Ес] /). Все еще делает глобальный поиск – Andrejs

+0

(угадайте, потому что он рассматривает каждый «data-correctanswer» как отдельную строку) – Andrejs

+0

Чтобы быть совершенно ясным, вы хотите уменьшить из '[ça, ça, vé, bién]' to '[ ça, vé] '? – spenibus

ответ

1

Вот как вы можете это сделать:

var buttons = ''; 
 

 
function createButtons(lettersToMatch){ 
 
    $('.FillIn input').each(function() { 
 
     var corrAns = $(this).attr('data-correctanswer'); 
 
     
 
     for (var i = 0; i < corrAns.length; i++) { 
 
      var match = corrAns[i].match(new RegExp(lettersToMatch)); 
 
      if (match) { 
 
       buttons += '<button>' + corrAns[i] + '</button>'; 
 
       lettersToMatch = lettersToMatch.replace(match[0], ""); 
 
      } 
 
     } 
 
    }); 
 
} 
 

 
//Testing 
 
createButtons("[éèçêïë]"); 
 
$("body").append(buttons);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<form class="FillIn Rearrange"> 
 
    <input data-correctanswer="çaï" type="text">, 
 
    <input data-correctanswer="ça" type="text"> 
 
    <input data-correctanswer="vé" type="text"> 
 
    <input data-correctanswer="bién" type="text"> 
 
</form>

+1

Если вы помещаете скобки в объявление regexp и используете только буквы в 'lettersToMatch', вы можете остановиться раньше, когда' lettersToMatch' пуст. Вы также можете вернуть кнопки, а не связывать их глобально. – spenibus

+0

Сэр, ты потрясающий. Принимая за правильность дополнительных усилий фрагмента кода. Я понимаю, что эта строка «lettersToMatch = lettersToMatch.replace (match [0]», «»); делает то, что мне не хватает. Но я смутно понимаю, как он заменяет что-то найденное ничем («»). Вы бы так любезны и прокомментируете эту строку? – Andrejs

+0

Вы можете узнать больше о том, как работает функция replace() [здесь] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace). Просто то, что он делает, это найти первый аргумент в строке и заменить его на второй. –

1

Похоже, что вы хотите закончить цикл, как только вы получите матч, так что бросить в перерыве заявлении:

var buttons = ''; 
     $('.FillIn input').each(function() { 
      var corrAns = $(this).attr('data-correctanswer'); 


      for (var i = 0; i < corrAns.length; i++) { 
       if (corrAns[i].match(/[éç]/g)) { 
        buttons += '<button>' + corrAns[i] + '</button>'; 
        break; 
       } 
      } 
     }); 
+0

Это не работает. Сначала это остановилось бы. Но мне нужно, чтобы он продолжал искать, пока не будет найдено é. – Andrejs

+0

О, так вы хотите остановиться после хотя бы одного é и хотя бы одного ç? У вас может быть отдельный оператор regex if для каждого, и всякий раз, когда вы получаете совпадение, вы устанавливаете флаг для этой буквы. После утверждений if вы проверяете, являются ли оба флага истинными, и если да, перерыв –

+0

Я предполагаю, что я должен был упомянуть, что это на самом деле для многих других букв - [é, è, à, ù, â, ê, î, ô, û] (и более). поэтому я действительно предпочитаю избегать отдельных регулярных выражений. – Andrejs

1

Вам просто нужно помнить, что вы уже нашли и не обрабатывать его:

var buttons = ''; 
var found = []; // this remembers what we have already found 

$('.FillIn input').each(function() { 

    var corrAns = $(this).attr('data-correctanswer'); 

    for (var i = 0; i < corrAns.length; i++) { 

     var m; // hold the match 
     if (m = corrAns[i].match(/[éç]/)) { 

      // not found yet 
      if(found.indexOf(m[0]) == -1) { 

       found.push(m[0]) // remember it's been found 
       buttons += '<button>' + corrAns[i] + '</button>'; 
      } 
     } 
    } 
}); 
+0

Ты тоже такой классный :). Когда я шел домой, я начал думать о том, чтобы подталкивать совпадающих персонажей в отдельный массив. И ты прибил его. – Andrejs

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