将在关键字之后和问号之前匹配的正则表达式

Posted

技术标签:

【中文标题】将在关键字之后和问号之前匹配的正则表达式【英文标题】:Regex that wil match after keyword and before question mark 【发布时间】:2018-04-17 14:58:12 【问题描述】:

我在 regex101 上遇到了以下测试字符串:

https://localhost:8443/site/recipes/recepten-zoeken/menugang:hoofdgerecht/soort:italiaans/seizoen:winter?Nrpp=24

我正在尝试匹配介于两者之间的所有内容:recepten-zoeken/ 和 ?​​p>

我目前的尝试让我无处可去,因为我是编写正则表达式的新手。有没有人想参与?

这是我目前拥有的:

.(?=([^/recepten-zoeken/]?)*$)

【问题讨论】:

【参考方案1】:

尝试在捕获组中捕获您的值:

recepten-zoeken\/([^?]+)\?

说明

recepten-zoeken 字面匹配 \/匹配正斜杠 ([^?]+) 在组中捕获一个否定字符类[^,它将不匹配问号。 (这将包含您的价值) \? 字面匹配

var s = "https://localhost:8443/site/recipes/recepten-zoeken/menugang:hoofdgerecht/soort:italiaans/seizoen:winter?Nrpp=24"
console.log(s.match(/recepten-zoeken\/([^?]+)\?/)[1])

感谢 ctwheels 提供 sn-p 和评论。

【讨论】:

你忘记了/ @ctwheels 啊,您在评论中发布了它..您应该发布您的答案!我会删除我的。 我不介意,你可以使用它。你几乎在同一时间也这么想,我没有权利;)尽管创建一个 sn-p :) 我也删除了我的评论 正要发布它,但你很快! :-) 谢谢!【参考方案2】:

使用捕获组。(()括号表示捕获组)

捕捉到最后一个问号

试试这个正则表达式\/recepten-zoeken\/(.*)\?

解释:-

\/匹配正斜杠 recepten-zoeken 字面匹配 \/匹配正斜杠 (.*) 在一个组中捕获所有值(新行除外)直到字符串中的最后一个问号(这将包含您的值) \? 字面匹配

//-------------------------select upto last ? -----------------------------

str = "https://localhost:8443/site/recipes/recepten-zoeken/menugang:hoofdgerecht/soort:italiaans/seizoen:winter?Nrpp=24";
var myRegexp = /\/recepten-zoeken\/(.*)\?/;
console.log(myRegexp.exec(str)[1]);

捕捉到第一个问号

试试这个正则表达式\/recepten-zoeken\/([^?]*)\?

解释:-

\/ 匹配正斜杠 recepten-zoeken 字面上匹配 \/匹配正斜杠 ([^?]*) 在一个组中捕获所有值(除了?)直到字符串中的第一个问号(这将包含您的值)(这里 [^?] 表示匹配除? 之外的任何字符) \? 字面匹配

//-------------------------select upto first ? -----------------------------

var str = "https://localhost:8443/site/recipes/recepten-zoeken/menugang:hoofdgerecht/soort:italiaans/seizoen?:winter?Nrpp=24";
var myRegexp = /\/recepten-zoeken\/([^?]*)\?/;
console.log(myRegexp.exec(str)[1]);

【讨论】:

如果字符串中有两个?,则匹配不正确 这将匹配到最后一个问号,当有多个 ? 时,没有迹象表明它想要输出什么 @ctwheels 我的错误 不用担心,只要表明是这样的。此外,如果这是预期的结果,请引入一种修复它的方法,以便它匹配第一个问号。这将更好地帮助解释您的答案,并为 OP 提供适当的信息,以选择最能回答他们的问题的答案。保留您现有的答案(如果这是 OP 正在寻找的),只需引入第二个正则表达式以允许最多第一个 ? 匹配。你是对的,如果有多个?,没有任何迹象表明应该是什么输出 现在看起来更完整了! :) 为了清楚起见,您可以考虑将两个 sn-p 分成两个不同的,而不是合并到同一个 sn-p 中。【参考方案3】:

这样就可以了:

var match = url.match(/\/recepten-zoeken\/([^?]+)\?/);
// match[1] == "menugang:hoofdgerecht/soort:italiaans/seizoen:winter"

这个正则表达式将匹配第一次出现的/recepten-zoeken/,然后它将开始捕获所有不是问号的字符([^?] 是一个否定字符类,它匹配类中的任何 )。

请注意,它还将确保有一个问号。如果您想支持没有问号的案例,则只需删除最后的\?

您的原始正则表达式仅匹配单个字符(.),然后它会尝试向前查找不是cek/n 之间的字符和z

【讨论】:

以上是关于将在关键字之后和问号之前匹配的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 awk 命令在匹配正则表达式之前和之后打印 5 行

正则表达式规则

在 mod_rewrite 规则正则表达式中匹配问号

Linux07--Shell程序设计03 通配符与正则表达式

正则表达式匹配指定数据和字母

PHP中正则表达式匹配字母