2016-02-24 4 views
5

Я хочу совместить строку, где число равно или больше числа в группе захвата.Можно использовать обратную ссылку в диапазоне номеров?

Пример:

  • 1x1 = матч
  • 1x2 = матч
  • 2x1 = не ровня

На мой взгляд, регулярное выражение будет выглядеть примерно так (\d)x[\1-9], но это не Работа. Можно ли добиться этого с помощью регулярного выражения?

+3

Что такое аромат регулярного выражения? –

+0

Я пытаюсь использовать его в Google Analytics, который я не уверен, какой вкус, но я бы предположил, что PCPRE – Frinsh

+2

Нет, GA использует RE2. Это означает, что это невозможно сделать с помощью чистого регулярного выражения. –

ответ

2

Как вы обнаружили, вы не можете интерполировать значение в регулярное выражение, потому что:

Поскольку классы символов определяются, когда регулярное выражение компилируется ... Тип регулярных выражений узел только класс персонажа «Аппаратно закодированный список символов ", который был сгенерирован при компиляции регулярного выражения (не после того, как он прошел частично, и выяснил, что может стоить $ 1).

[Source]

Поскольку классы символов не позволяют обратные ссылки, обратный слэш с последующим номером переориентированы в классе символов:

Обратный слэш следуют два или три восьмеричных цифр считается восьмеричным числом.

[Source]

Это, очевидно, не то, что вы предписанию [\1-9]. Но так как нельзя компилировать класс символов до тех пор, пока все символы не будут известны, нам придется найти другой способ.

Если мы хотим сделать это полностью в регулярном выражении, мы не можем перечислить все возможные комбинации, потому что нам нужно будет проверить все захваты, чтобы выяснить, какой из них соответствует. For example:

"1x2" =~ m/(?:(0)x(\d)|(1)x([1-9])|(2)x([2-9])|(3)x([3-9])|(4)x([4-9])|(5)x([5-9])|(6)x([6-9])|(7)x([7-9])|(8)x([89])|(9)x(9))/ 

будет содержать «1» в $3 и «2» в $4, но вы должны искать улавливает 1 до 20, чтобы найти, если что-то было подобрано каждый раз.


Единственный способом обходите постобработки на регулярных выражения результатов является использование регулярных выражений условно: (?(A)X) Где A является условным и X является результирующим действием.

Sadly conditionals are not supported by RE2, но мы будем продолжать демонстрировать, что это можно сделать.

То, что вы хотели бы использовать для X является (*F) (или (?!) в Рубине 2+), чтобы заставить отказ: http://www.rexegg.com/regex-tricks.html#fail

То, что вы хотели бы использовать для A является ?{$1 > $2}, но only Perl will allow you to use code directly in a regex.Perl позволяет вам использовать:

m/(\d)x(\d)(?(?{$1 > $2})(?!))/ 

[Live Example]

Таким образом, ответ на ваш вопрос: "Нет, вы не можете сделать это с RE2, которые Google Analytics использует, но да, вы можете сделать это с регулярным выражением Perl ».

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