0

考虑我的几个输入字符串。

  1. http://local.app.com/local/frontend/v12/#/abcde/
  2. http://local.app.com/local/frontend/v12/#/abcde/!/fghij/
  3. http://local.app.com/local/frontend/v12/#/abcde/!/ghijk/!/klmno/

我写了这个正则表达式,它适用于输入字符串 1。

(?:([a-zA-Z0-9.://_]*)(/#/(?=([a-zA-Z0-9]{5})/)))

Output:
http://local.app.com/local/frontend/v12/#/,http://local.app.com/local/frontend/v12,/#/,abcde

但是当我扩展它以支持输入字符串 1,2 和 3 的重复!/.../占位符时,它不起作用并给出空字符串而不是令牌。

(?:([a-zA-Z0-9.://_]*)(/#/(?=([a-zA-Z0-9]{5})/))(!/(?=([a-zA-Z0-9]{5})/))*)

Output:
http://local.app.com/local/frontend/v12/#/,http://local.app.com/local/frontend/v12,/#/,abcde,,
4

2 回答 2

0

我的正则文本的屏幕截图,请参阅评论

希望这将澄清我的评论和之前的评论。

于 2012-09-13T16:40:13.223 回答
0

?= 实际上捕获由您在 ?= 之后指定的内容定义的位置,它不会(也)捕获可能与环视规范匹配的任何内容 (?=)。

尝试

(.+? # (/[a-zA-Z0-9]{5}/) (!/([a-zA-Z0-9]{5})/)* )

(希望我没有打错字,现在无法测试。)

这应该捕获完整的输入,但是内部的各种捕获使您可以访问捕获的“令牌”。

此外,您可以为内部的各种捕获命名,以便在匹配中更容易识别它们:

(.+?#(/(?<tokenFirst>[a-zA-Z0-9]{5})/)(!/(?<tokenMore>[a-zA-Z0-9]{5})/)*)

成功

于 2012-09-13T14:25:40.780 回答