2013-08-28 2 views
0

Я пытаюсь выяснить, можно ли агрегировать два шаблона в одном.Javascript Regex patterns

Так что мой вход может быть что-то вроде этого:

input = "200px" 
input = "200pt" 

Мой ожидаемый результат будет result = ["200","pt"] или ["200","px"]

var result = input.match(/[^pt]+|pt/g) 

Любой знает, если это возможно, в одной модели, обрабатывать pt или px суффиксы ?

Решаемые

result = input.match(/^([0-9]+)(px|pt)$/).slice(1); 

или

result = input.match(/^([0-9]+)((p[xt]|r?em)).slice(1); 

Спасибо ребята

ответ

0

Вы можете сделать это следующим образом:

var input = "200px"; // or 200pt; 
var result = input.match(/^([0-9]+)(px|pt)$/); 
// result: ["200px", "200", "px"] 
result = result.slice(1); // ["200", "px"] 

регулярное выражение я n English:

  • ^ начало в начале строки.
  • ([0-9]+) соответствует 1 или более цифрам и фиксирует их.
  • (px|pt) матч px или pt и захватить его.
  • $ конец должен быть в конце строки.
+1

Вместо ' (px | pt) '*, который работает, конечно, *, вы можете использовать' (p [xt]) '. –

+0

Я не люблю это делать. Что делать, если вы также хотите совместить 'em' и' rem' и одну из многих других мерных метрик? Почему вы хотите быть умными с этим? Если бы я мог, я проголосовал бы за ваш комментарий. – Halcyon

+0

привет, ваше предложение хорошее, но знаете ли вы, есть ли другой вариант, чтобы использовать первый матч? это предположительно потребляет любую метрику, но идеальный случай был именно таким результатом = ["value", "metric"] –

3

Вы можете использовать захватив группу:

input.match(/(\d+)(p[tx])/) 
// -> Array ["200px", "200", "px"] 

Чтобы получить точную result вы хотели (без согласования всей строки), вы можете split до p:

input.split(/(?=p)/) 
// -> Array ["200", "px"] 
+1

+1 для метода разделения, который выглядит как наиболее эффективный ответ. – Christophe