javascript正则表达式在表达式中插入新元素

javascript正则表达式在表达式中插入新元素

问题描述:

我将一个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

让我们打破你的正则表达式

^\/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

,看来你”在.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