javascript - 可选的正则表达式前瞻

标签 javascript regex

我正在尝试获得一个可选的前瞻性,但是当我将其设为可选(在其后添加 ? )时遇到问题,即使数据存在,它也不再匹配。

作为一个简短的总结,我正在尝试从 URI 中提取特定的查询字符串参数。示例:

/.*foo.html\??(?=.*foo=([^\&]+))(?=.*bar=([^\&]+))/
    .exec( 'foo.html?foo=true&bar=baz' )

我会稍微分解一下:

.*foo.html\??      // filename == `foo.html` + '?'
(?=.*foo=([^\&]+)) // find "foo=...." parameter, store the value
(?=.*bar=([^\&]+)) // find "bar=...." parameter, store the value

以上示例在 foobar 作为参数存在于查询字符串中的情况下完美运行。问题是我试图使这些成为可选的,所以我将其更改为:

/.*foo.html\??(?=.*foo=([^\&]+))?(?=.*bar=([^\&]+))?/
                                ↑                  ↑
    Added these question marks ─┴──────────────────┘

它不再匹配任何参数,尽管它仍然匹配 foo.html。有什么想法吗?

最佳答案

尝试将问号放入 look-ahead 中:

...((?=(?:.*foo=([^\&]+))?)...

看起来很奇怪,但我认为漂亮的正则表达式不是目标:-)

还有,你有没有想过这个?

/.*foo.html\??.*(?:foo|bar)=([^\&]+).*(?:bar|foo)=([^\&]+)/

关于javascript - 可选的正则表达式前瞻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9012729/

相关文章:

javascript - 在可编辑网格中,如何使Ext组合框在选择项目时立即结束编辑模式?

javascript - 使用过滤的 Ember 数据的 jQuery DataTables - 列宽度不会调整大小

javascript - 使用 nashorn 从 JavaScript 引用现有 Java 对象

regex - 如何使用Powershell正则表达式从事件日志消息中获取数字?

javascript - 通过 REGEX 验证所有语言字符的字段

Java - 用正则表达式替换所有,然后替换第一次出现的字符串

javascript - 如何强制我的 Chrome 浏览器接受 .requestFullscreen()?

javascript - 如何在 Android 上以编程方式退出全屏视频?

regex - 如何仅在小数分隔符之前插入千位分隔符

php - 如何使用 preg_replace 在 PHP 中转义 $?