Regex с Unicode от PHP до Javascript

Я в процессе портирования некоторого кода php, который я должен использовать nodejs.
Проблема, с которой я сталкиваюсь в этом регулярном выражении PCRE:

/\/?_?[0-9]*_?([^\/\._]*)[_#*\-*\.?\p{L}\p{M}*]*$/u

(это регулярное выражение совпадает с first в _4_first_ääää , в _first_äääää или first_äääää )

Я использую XRegExp в этом контексте, но не повезло:

 // lib/parser.js var XRegExp = require('xregexp').XRegExp; module.exports = { getName : function(string){ var name = XRegExp('\/?_?[0-9]*_?([^\/\._]*)[_#*\-*\.?\p{L}\p{M}*]*$'); var matches = XRegExp.exec(string, name); if(matches && matches.length > 0){ return matches[1]; } else{ return ''; } } }; 

И тест (мокко), который идет с ним:

 // test/test.js var assert = require("assert"); var parser = require('../lib/parser.js'); describe('parser', function(){ describe('#getName()', function(){ it('should return the name contained in the string', function(){ assert.equal('test', parser.getName('3_test')); assert.equal('test', parser.getName('test')); assert.equal('test', parser.getName('_3_test')); assert.equal('test', parser.getName('_3_test_ääää')); assert.equal('test', parser.getName('_3_test_boom')); }) }) }) 

И результаты тестов:

 0 passing (5ms) 1 failing 1) parser #getName() should return the name contained in the string: AssertionError: "test" == "ääää" + expected - actual +ääää -test 

Этот код соответствует ääää .
first прокомментированная строка улавливается, поэтому я предполагаю, что упускаю из виду классы unicodes caracter.

Мой вопрос: как я могу заставить свое оригинальное регулярное выражение php работать в javascript?

Mmaybe есть работа вокруг?

Поставьте якорь в начале:

 ^\/?_?[0-9]*_?([^\/\._]*)[_#*\-*\.?\p{L}\p{M}*]*$ 

Также вы можете удалить ненужное экранирование:

 ^/?_?[0-9]*_?([^/._]*)[-_#*.?\p{L}\p{M}]*$ 

Ваше регулярное выражение также содержит пустую строку, возможно, вы хотите:

 ^/?_?[0-9]*_?([^/._]+)[-_#*.?\p{L}\p{M}]+$ 

Согласно вашему образцу, идентификатор может быть:

 ^/?(?:(?:_\d+)?_)?([^/._]+)[-_#*.?\p{L}\p{M}]+$ 

Наконец, мне удалось найти причину проблемы. В \ p {L} и \ p {M} требуется еще одна обратная косая черта в синтаксисе Xregexp. Это изменение заставило исходное регулярное выражение снова работать.

 var unicodeWord = XRegExp('^\\p{L}+$'); unicodeWord.test('Русский'); // -> true unicodeWord.test('日本語'); // -> true unicodeWord.test('العربية'); // -> true 

из примеров использования: https://github.com/slevithan/xregexp/blob/master/README.md#usage-examples