code: private Node divideLookBehindAlternatives(Node node) {
          AnchorNode an = (AnchorNode)node;
          int anchorType = an.type;
          Node head = an.target;
          Node np = ((ListNode)head).value;
  
          node.replaceWith(head);
  
          Node tmp = node;
          node = head;
          head = tmp;
  
          ((ListNode)node).setValue(head);
          ((AnchorNode)head).setTarget(np);
          np = node;
  
          while ((np = ((ListNode)np).tail) != null) {
              AnchorNode insert = new AnchorNode(anchorType);
              insert.setTarget(((ListNode)np).value);
              ((ListNode)np).setValue(insert);
          }
  
          if (anchorType == AnchorType.LOOK_BEHIND_NOT) {
              np = node;
              do {
                  ((ListNode)np).toListNode(); /* alt -> list */
              } while ((np = ((ListNode)np).tail) != null);
          }
  
          return node;
      }
docs: /* divide different length alternatives in look-behind.
  (?<=A|B) ==> (?<=A)|(?<=B)
  (?<!A|B) ==> (?<!A)(?<!B)