2017-10-16 84 views
0

我將一個URL傳遞給需要在正則表達式中插入新元素的代碼塊。很確定正則表達式是有效的,代碼似乎是正確的,但無論我似乎無法執行匹配正則表達式!javascript正則表達式在表達式中插入新元素

//** Incoming url's 
//** url e.g. api/223344 
//**   api/11aa/page/2017 

//** Need to match to the following 
//** dir/api/12ab/page/1999 
//** Hence the need to add dir at the front 

var url = req.url; 
//** pass in: /^\/api\/([a-zA-Z0-9-_~ %]+)(?:\/page\/([a-zA-Z0-9-_~ %]+))?$/ 
var re = myregex.toString(); 
//** Insert dir into regex: /^dir\/api\/([a-zA-Z0-9-_~ %]+)(?:\/page\/([a-zA-Z0-9-_~ %]+))?$/ 
var regVar = re.substr(0, 2) + 'dir' + re.substr(2); 

var matchedData = url.match(regVar); 
matchedData === null ? console.log('NO') : console.log('Yay'); 

我希望我只是想念明顯,但任何人都可以看到爲什麼我不能匹配,總是返回NO?

感謝

+0

因爲你把「目錄」進入組合來匹配您的網址您正則表達式不起作用基於關閉您的評論值/正則表達式,但它並沒有在您的網址例子存在。所以......你究竟想在這裏完成什麼? –

+0

除此之外,將字符串化的正則表達式對象傳遞給'.match()'不會像您期望的那樣工作。例如''foo「.match(」。*「)'會返回」foo「,但是'var x = /foo/.toString(); 「foo」.match(x)''返回'null',因爲你傳遞了「/.*/」(注意到分隔符),'.match()'希望在那一點找到文字'/'字符 –

+0

是的,對於更多關於大腦轉儲的問題,更不用說了。 – TheTechy

回答

2

讓我們打破你的正則表達式

^\/api\/這個字符串開始處匹配,它看起來精確匹配字符串「/ API」

([a-zA-Z0-9-_~ %]+)這是一個捕獲組:這一個具體將捕獲那些括號內的任何內容,其中+指示捕獲1個或更多,因此例如,該部分將匹配abAB25-_ %

(?:\/page\/([a-zA-Z0-9-_~ %]+))這會將多個令牌分組在一起,但不會像上面那樣創建一個捕獲組(?:使其無法捕獲)。您首先匹配的字符串完全類似「/ page /」,後面跟上一段中提到的完全相同的組(即匹配az,AZ,0-9等)。

?$已結束,?意味着捕捉0以上的precending組,和$字符串的結尾

此正則表達式將這個字符串匹配相匹配,例如:/api/abAB25-_ %/page/abAB25-_ %

您可以採取的捕獲組的優勢,然而, ,並使用類似的方式來獲得類似的結果:^\/api\/([a-zA-Z0-9-_~ %]+)\/page\/\1?$。在這裏,我們使用的是\1來引用該第一捕獲組並匹配它匹配的完全相同的記號。編輯:實際上,這可能無法正常工作,因爲/ api /之後的文本和/ page /之後的文本很可能會不一樣,進行...

之後,您正在將「dir」添加到你的搜索開始,所以你現在可以像這樣匹配:dir/api/abAB25-_ %/page/abAB25-_ %

你現在也已經將正則表達式轉換爲一個字符串,就像Crayon Violent在他們的評論中指出的一樣,這會打破你期望的功能。 var matchedData = url.match(regVar.source);https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source

現在可以正確地匹配這樣的字符串:您可以通過使用.source在您的正則表達式解決這個dir/api/11aa/page/2017看看這個例子:由於蠟筆小新在評論暴力提到https://repl.it/Mj8h

+0

就像僞正則表達式字符串上的.source! 不解決問題,因爲它現在匹配整個字符串,並不返回一個匹配元素數組,但真的很喜歡答案:) 雖然給我思考。 – TheTechy

0

,看來你」在.match()函數中重傳字符串而不是正則表達式。可能試試以下內容:

url.match(new RegExp(regVar, "i")); 

將字符串轉換爲正則表達式。 「我」是無視情況;不知道那是你想要的。這裏瞭解更多:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp

+0

像這樣使用'RegExp'將不會像原樣那樣工作,因爲它也需要一個字符串表達式,但沒有分隔符,這與將正則表達式作爲字符串傳遞給'.match() '。爲了解決這部分問題,他不應該在他的regex對象上使用'.toString()',而應該使用['.source'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source)和['.flags'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/flags)他的原始正則表達式對象被分解,修改和重建。 –

+0

乾杯。我實際上已經通過對連接字符串中的新RegEx對象表示遺憾,找到了一個很好的解決方案。 – TheTechy