0

我正在将一些我必须的php代码移植到nodejs。
我遇到的问题与这个 PCRE 正则表达式有关:

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

(此正则表达式匹配, firstin或)_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 字符类。

我的问题是:我怎样才能让我原来的 php 正则表达式在 javascript 中工作?

或许有解决办法?

4

2 回答 2

0

在开头放一个锚:

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

您也可以删除不必要的转义:

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

您的正则表达式也匹配一个空字符串,可能是您想要的:

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

根据您的示例, id 可能是:

^/?(?:(?:_\d+)?_)?([^/._]+)[-_#*.?\p{L}\p{M}]+$
于 2014-03-26T18:02:37.843 回答
0

我终于设法找到了问题的根源。\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

于 2014-03-30T15:12:43.737 回答