Портирование регулярных выражений из PHP в JavaScript - PullRequest
0 голосов
/ 11 сентября 2009

У меня есть следующее регулярное выражение в PHP:

/(?<=\')[^\'\s][^\']*+(?=\')|(?<=")[^"\s][^"]*+(?=")|[^\'",\s]+/

и я хотел бы перенести его на javascript, например:

var regex = new RegExp('/(?<=\')[^\'\s][^\']*+(?=\')|(?<=")[^"\s][^"]*+(?=")|[^\'",\s]+/');

var match = regex.exec("hello,my,name,is,'mr jim'")

for( var z in match) alert(match[z]);

Есть что-то, что JavaScript здесь не нравится, но я понятия не имею, что это такое. Я пытался найти различия между PHP и регулярным выражением JS с помощью регулярных выражений, но не вижу ничего очевидного.

Любая помощь будет принята с благодарностью

Еще раз спасибо

Изменить: Кажется, проблема заключается в позитивном взгляде, но означает ли это, что его нельзя портировать?

Ответы [ 3 ]

2 голосов
/ 11 сентября 2009

Правильно - позитивные взгляды не будут работать.

Но, как и некоторые общие сведения о регулярных выражениях в Javascript, вот пара советов для вас.

Вам не нужно использовать объект RegExp - вместо него можно использовать литералы шаблона

var regex = /^[a-z\d]+$/i;

Но если вы используете объект RegExp, вы должны избегать обратной косой черты, поскольку ваш шаблон теперь заблокирован в строке.

var regex = new RegExp( '^[a-z\\d]+$', 'i' );

Основным преимуществом объекта RegExp является наличие в вашем образце динамического бита, например

var max = 4;
var regex = new RegExp( '\d{1,' + max + '}' );
1 голос
/ 11 сентября 2009

У вас нет взгляда назад (и у браузера есть проблемы в IE, поэтому лучше избегать этого). Но легко позволить этим «и» персонажам быть частью матча, а затем выбросить их:

var value= "hello,my,name,is,'mr jim'";
var match;
var r= /'[^'\s][^']*'|"[^"\s][^"]*"|[^'",\s]+/g;

while(match= r.exec(value)) {
    var text= match[0];
    if ('"\''.indexOf(text.charAt(0))!=-1) // starts with ' or "?
        text= text.substring(1, text.length-1);
    alert(text);
}

Или используйте круглые скобки, чтобы выделить кавычки из текста:

var r= /'([^'\s][^']*)'|"([^"\s][^"]*)"|([^'",\s]+)/g;

while (match= r.exec(value)) {
    var text= match[1] || match[2] || match[3];
    alert(text);
}

(Полагаю, ваш for(var z in match) должен был зацикливаться на каждом совпадении с шаблоном в строке. К сожалению, JavaScript не так легко работает.)

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

1 голос
/ 11 сентября 2009

это (?<=) позитивный взгляд, который не поддерживает Javascript. но имейте в виду, что реализация Javascript в разных браузерах значительно различается.

Редактировать : существует ТАК вопрос, посвященный обходному решению .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...