2014-03-26 50 views
0

我正在將一些php代碼移植到nodejs中。
這個問題我有顧慮這個PCRE正則表達式:使用Unicode從PHP到Javascript的正則表達式

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

(這個表達式匹配_4_first_ääää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

有作爲 「PHP正則表達式」 沒有這樣的事。你可能意思是'perl兼容正則表達式'(或'preg')。我必須承認,我一點也不贊同XRegExp,所以不能真正幫助你。您需要查看兩者之間的解析差異。 – Tularis

+2

@tularis - 通常人們會用一些有用的東西跟進不必要的澄清。 – Anthony

+0

聲明:我不知道XRegExp,所以我可能是錯的。但是你似乎在第一個語句中錯過了分隔符:'XRegExp('\'。你可能想要像'XRegExp'('@ /?_?... * $ @')'' –

回答

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

0

把錨在開始時:

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

你也可以刪除不必要的轉義:

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

你的正則表達式也匹配空字符串,可能是你想要的:

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

根據您的示例,身份證可能是:

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

感謝您的回答我會嘗試一旦我不在手機 –

+0

感謝您改善我的查詢,不幸的是,當我用這些之一切換我的正則表達式時,我得到一個空'匹配'變量。只是在開頭添加'^'的事實給了我一個空'匹配'...?! –

+0

@ m.pons:這當然是因爲你之前還有其他角色。你能顯示一個真正的字符串,你必須檢查? – Toto

相關問題