Regex Lookbehind в альтернативах JavaScript

В принятом ответе не принимаются ключи-модификаторы, такие как ctrl или shift, но они указывают, что текущий выбор должен быть заменен не , но расширен.

Кроме того, я добавлена ​​поддержка нескольких ОС, проверив mousePressed и mouseReleased.

Следуя, вы можете найти полный пример того, как отрегулировать выбранные строки, используя ListSelectionModel , в том числе MouseEvent#getModifiers . После этого можно открыть (необязательно) JPopupMenu .

JPopupMenu contextMenu = new JPopupMenu();
// ...
// add elements to the popup menu
// ...

table.addMouseListener(new MouseAdapter() {
  @Override
  public void mousePressed(MouseEvent e) {
    handleRowClick(e);
    if (e.isPopupTrigger()) {
      doPop(e);
    } else {
      hidePop();
    }
  }

  @Override
  public void mouseReleased(MouseEvent e) {
    if (e.isPopupTrigger()) {
      doPop(e);
    }
  }

  private void handleRowClick(MouseEvent e) {
    ListSelectionModel selectionModel = table.getSelectionModel();
    Point contextMenuOpenedAt = e.getPoint();
    int clickedRow = table.rowAtPoint(contextMenuOpenedAt);

    if (clickedRow < 0) {
      // No row selected
      selectionModel.clearSelection();
    } else {
      // Some row selected
      if ((e.getModifiers() & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK) {
        int maxSelect = selectionModel.getMaxSelectionIndex();

        if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) {
          // Shift + CTRL
          selectionModel.addSelectionInterval(maxSelect, clickedRow);
        } else {
          // Shift
          selectionModel.setSelectionInterval(maxSelect, clickedRow);
        }
      } else if ((e.getModifiers() & InputEvent.CTRL_MASK) == InputEvent.CTRL_MASK) {
        // CTRL
        selectionModel.addSelectionInterval(clickedRow, clickedRow);
      } else {
        // No modifier key pressed
        selectionModel.setSelectionInterval(clickedRow, clickedRow);
      }
    }
  }

  private void doPop(MouseEvent e) {
    if (table.getSelectedRowCount() == 0) {
      return;
    }
    contextMenu.setVisible(true);
    contextMenu.show(e.getComponent(), e.getX(), e.getY());
  }

  private void hidePop() {
    contextMenu.setVisible(false);
  }
});

0
задан yunzen 18 January 2019 в 14:37
поделиться

2 ответа

Просто обновите свою версию Node.js. Смотровые утверждения являются частью ECMAScript 2018 и уже реализованы в Chromium и Node.js. Согласно http://kangax.github.io/compat-table/es2016plus/ , Chromium 70 и Node.js 8.10 имеют эту функцию.

Я только что проверил это в своем браузере и в Node.js (v8.11) и могу подтвердить, что:

node -e "console.log('nothing@xyz, bla'.match(/(?<=@[A-Za-z]+,)\s+/))"

Если вы не можете обновить, вы должны использовать другие стратегии, такие как захват и замена. что не должно быть большой проблемой с положительным взглядом сзади (негативы сложнее):

const hit = 'nothing@xyz, bla'.match(/(@[A-Za-z]+,)\s+/)
hit[0].replace(hit[1])

Если ничего не работает, взгляните на этот проект, который пытается реализовать Lookbehind (я не проверял его) : http://blog.stevenlevithan.com/archives/javascript-regex-lookbehind

0
ответ дан wortwart 18 January 2019 в 14:37
поделиться

Что вам нужно сделать, так это преобразовать lookbehinds в группы захвата, чтобы включить их в строку замены (обратите внимание, что установлен регистрозависимый флаг (i)):

(@[a-z]+,)([\t ]*([a-z]+)[\t ]*(?=\[[a-z]+\])|[\t ]+)

Заменить на [ 112], если вы хотите удалить эти пробелы.

См. живое демо здесь

.
0
ответ дан revo 18 January 2019 в 14:37
поделиться
Другие вопросы по тегам:

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