Регулярное выражение без повторения среднего выражения (axb | cxd) - PullRequest
3 голосов
/ 25 ноября 2011

Я просто непрерывно бью эту стену, я не могу ее решить.Я пытаюсь получить регулярное выражение, которое выполняется как:

(axb|cxd)

, за исключением того, что без повторения x в выражении (так как это действительно длинное выражение, соответствующее кодированию).Это проверено на большой строке, где мне нужно только сопоставить x для замены строки, поэтому опция нулевой ширины вперед / назад является опцией.Любые идеи?

a, b, c и d достаточно малы, поэтому они могут повторяться, если это облегчает формирование выражения.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Если вы действительно не хотите повторять x в регулярном выражении, тогда вам придется применить некоторую логику ручного поиска.Вы можете искать x с помощью регулярного выражения, а затем, основываясь на том, где оно было найдено, искать a перед ним и b после него или c перед ним и d после него.Но, скорее всего, это будет больше работы, чем просто повторять его в регулярном выражении, как в ответе Гейба.

Например, вы можете сделать это:

var re = /(a|c)x(b|d)/;
var matches = str.match(re);
if (matches) {
    // exclude axd or cxb
    if ((matches[1] + matches[2]).match(/ab|cd/)) {
        // found axb or cxd
    }
}

Но, честно говоря, похоженапример, было бы проще включить x дважды и позволить движку регулярных выражений сделать за вас грязную работу:

if (str.match(axb|cxd)) {
    // found match
}

Или, если слишком сложно вводить x в строку дважды, то создайте регулярное выражение самостоятельноиспользуя javascript string math:

var x = "long complicated regex";
var re = new RegExp("a" + x + "b|c" + x + "d");
if (str.match(re)) {
    // found match
}
1 голос
/ 25 ноября 2011

Легкого пути нет.Вы должны сделать что-то вроде этого:

var x = "long, complicated regular expression";
var re = new RegExp("a" + x + "b|c" + x + "d");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...