сопоставить все до и сопоставить после определенного персонажа - PullRequest
1 голос
/ 07 июля 2010

Мне нужно одно регулярное выражение, чтобы сопоставить все до и одно после всего определенного символа, например двоеточия.

 foo:bar

Что-то, что соответствует 'foo', и то, что соответствует 'bar'.

Ответы [ 6 ]

7 голосов
/ 07 июля 2010

Не используйте регулярные выражения для этого. Используйте split .

3 голосов
/ 07 июля 2010

В регулярном выражении вы можете определить группы (в скобках).

"foo:bar".match(/(.*?):(.*)/) // -> ["foo:bar", "foo", "bar"]
//                               whole regexp, 1st group, 2nd group

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

(что действительно не имеет значения в этом случае, но имеет значение, когда вы будете соответствовать, например, "foo: bar: spam")

2 голосов
/ 07 июля 2010

Здесь вам не нужны регулярные выражения.

var middle = str.indexOf(':');
var key = str.substr(0, middle);
var value = str.substr(middle + 1);

Если вы хотите использовать регулярные выражения, вы можете сделать это следующим образом:

var matches = /([^:]+):(.+)/.exec(str);

var key = matches[1];
var value = matches[2];
1 голос
/ 07 июля 2010

Вы хотите смотреть вперед и смотреть назад.За каким материалом сопоставления следует или предшествует определенный символ, без включения этого символа в совпадение.

Для просмотра вперед у вас будет что-то вроде. * (? = :), что означает любой символ, 0 или более раз, после которых следует двоеточие, но не включайте двоеточие в совпадении,

Для просмотра назад у вас есть. * (? <= :), что означает любой символ 0 илибольше раз, перед двоеточием, но не включайте двоеточие в матче.Хитрость заключается в том, что выражение для поиска прибывает ПОСЛЕ остального, что может показаться нелогичным, потому что вы ищете двоеточие, которое предшествует, но это потому, что любое регулярное выражение действительно возвращает позицию, и вы хотите, чтобы двоеточие пришлопрямо перед этой позицией. </p>

1 голос
/ 07 июля 2010

Если вы хотите использовать регулярное выражение вместо str.split, вы можете использовать:

var str="foo:bar";
var pattern=/([^:]+):([^:]+)/gi;
var arr=pattern.exec(str);
arr.shift();

Теперь arr будет массивом из двух элементов: ['foo', 'bar'].

1 голос
/ 07 июля 2010

Эти двое должны это сделать:

'foo:bar'.match(/(.*):/)
'foo:bar'.match(/:(.*)/)

Будет ли в строке более одного ":"? Если это так, вы, вероятно, предпочли бы это:

'foo:bar'.match(/(.*?):/)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...