Я в процессе портирования некоторого кода 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