регулярное выражение “содержит” другое регулярное выражение

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

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

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

Это зависит только от двух селекторов, имеющих одинаковое значение класса, они могут быть связаны каким-то другим значением (например, свойством data- *).

Надеюсь, комментарии достаточны.

var matchSelected = (function() {
  // Store for "hidden" node
  var nodeStore = {
    sourceElement: null,
    node: document.createDocumentFragment(),
    index: null
  };

  return function(evt) {
    // Get the element that got the event
    var tgt = this;
    // If there's a stored option, put it back
    if (nodeStore.sourceElement) {
      let sel = nodeStore.sourceElement;
      sel.insertBefore(nodeStore.node.firstChild, sel.options[nodeStore.index]);
      nodeStore.sourceElement = null;
      nodeStore.node = document.createDocumentFragment();
      nodeStore.index = null;
    }
    // If the selected option is the first one, stop here
    if (tgt.selectedIndex == 0) return;
    // Get all selects with the same className
    var sels = document.querySelectorAll('.' + this.className);
    // Get the "other" option
    var other = sels[0] == this ? sels[1] : sels[0];
    // Remove and keep the option on the other element that is the same
    // as the selected option on the target element
    nodeStore.sourceElement = other;
    nodeStore.index = tgt.selectedIndex;
    nodeStore.node.appendChild(other.options[tgt.selectedIndex]);
  }
}());

window.addEventListener('DOMContentLoaded', function() {
  document.querySelectorAll('.countrySelect').forEach(
    node => node.addEventListener('change', matchSelected, false)
   );
}, false);
<select id="country1" class="countrySelect">
  <option value="" selected>Choose</option>
  <option value="1">Australia Dollar</option>
  <option value="2">Indonesian Rupiah</option>
  <option value="3">Chinese Yaun</option>
  <option value="4">Japanese Yen</option>
</select>
Convert to
<select id="country2" class="countrySelect">
  <option value="" selected>Choose</option>
  <option value="1">Australia Dollar</option>
  <option value="2">Indonesian Rupiah</option>
  <option value="3">Chinese Yaun</option>
  <option value="4">Japanese Yen</option>
</select>

8
задан Dror 10 June 2009 в 13:59
поделиться

2 ответа

Да.

Данная статья содержит детальное обсуждение темы (см. раздел 4.4).

6
ответ дан 5 December 2019 в 22:21
поделиться

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

Это будет работать только для «простых» регулярных выражений (или реальных, что у вас есть, рекурсивные выражения perls гораздо более выразительны).

В то время как граф конечного автомата может иметь большое количество путей, он все равно должен быть ограничен (особенно, если источником выражений является человек). Так что вы' d найти все допустимые пути к RegEX1 и проверить каждый по очереди, допустимы ли они в RegEX2. Если все пути допустимы, вы будете знать, что один содержится в другом.

0
ответ дан 5 December 2019 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: