我有一个字符串,结尾是不同的,例如index.php?test=1&list=UL
或 index.php?list=UL&more=1
。我想找到的是&list=
。
我该如何匹配它,无论它是在字符串中间还是在末尾? 到目前为止,我得到了[&|\?]list=.*?([&|$])
,但是([&|$])
部分实际上无法工作。 我试图使用它来匹配&
或字符串的末尾,但是字符串的末尾部分无法工作,因此这个模式可以匹配第二个示例但不能匹配第一个。
我有一个字符串,结尾是不同的,例如index.php?test=1&list=UL
或 index.php?list=UL&more=1
。我想找到的是&list=
。
我该如何匹配它,无论它是在字符串中间还是在末尾? 到目前为止,我得到了[&|\?]list=.*?([&|$])
,但是([&|$])
部分实际上无法工作。 我试图使用它来匹配&
或字符串的末尾,但是字符串的末尾部分无法工作,因此这个模式可以匹配第二个示例但不能匹配第一个。
简而言之
[...]
中的任何零宽断言都失去了其零宽断言的含义。[\b]
不匹配单词边界(它匹配退格符,或者在 POSIX 中匹配 \
或 b
),[$]
匹配字面上的 $
字符,[^]
要么是错误的,要么是在 ECMAScript 正则表达式中,匹配任何字符。与 \z
、\Z
、\A
锚点相同。
您可以使用以下任何模式解决问题:
[&?]list=([^&]*)
[&?]list=(.*?)(?=&|$)
[&?]list=(.*?)(?![^&])
如果你需要检查"绝对"、明确的字符串结束定位符,你需要记住,在不同的正则表达式风格中,它用不同的结构表示:
[&?]list=(.*?)(?=&|$) - OK for ECMA regex (JavaScript, default C++ `std::regex`)
[&?]list=(.*?)(?=&|\z) - OK for .NET, Go, Onigmo (Ruby), Perl, PCRE (PHP, base R), Boost, ICU (R `stringr`), Java/Andorid
[&?]list=(.*?)(?=&|\Z) - OK for Python
.*?([YOUR_SINGLE_CHAR_DELIMITER(S)]|$)
模式。但该模式效率较低,因为正则表达式引擎首先检查出现在惰性点模式右侧的模式,只有在它们不匹配时才会“展开”惰性点模式。[&?]list=([^&]*)
查看演示。详情
[&?]
- 匹配 &
或 ?
的正向字符类(请注意,字符类中的字符/字符范围之间的关系是 OR 关系)list=
- 子字符串、字符序列([^&]*)
- 捕获组 #1:零个或多个 (*
) 字符,除了 &
([^&]
),尽可能多地匹配检查是否存在结尾单个字符分隔符而不返回它或字符串结束
大多数正则表达式引擎(包括 ECMAScript 2018 开始的 JavaScript)都支持环视,这些构造仅在模式匹配或不匹配时返回 true 或 false。如果预计有可能出现以相同字符开头和结尾的连续匹配(请参阅原始模式,它可能匹配以 &
开头和结尾的字符串),则这些构造至关重要。虽然在查询字符串中不太可能出现这种情况,但这是一种常见情况。
在这种情况下,您可以使用两种方法:
(?=[SINGLE_CHAR_DELIMITER(S)]|$)
(?![^SINGLE_CHAR_DELIMITER(S)])
负向先行断言解决方案稍微更有效,因为它不包含添加匹配过程复杂性的交替组。OP 的解决方案将如下:
[&?]list=(.*?)(?=&|$)
或者
[&?]list=(.*?)(?![^&])
当然,如果尾随定界符是多字符序列,则仅使用正向先行解决方案才能起作用,因为[^yes]
不能否定一系列字符,而是类内的字符(即[^yes]
匹配除y
、e
和s
之外的任何字符)。
|
分隔两个或多个字符,是否需要使用()
? - Gary()
)。 - João Silva'SomeText/blahblah'.match(/Some([^\/]*)/)[1]
(输出为Text
)。请看我的答案,每一个解决方案都包含一个捕获组,用于捕获通常在返回匹配后作为第一组获取所需子匹配。 - Wiktor Stribiżewstring.match(/Some.*?(\/|$)/)[0];
。不过现在不知道是干什么用的。哈哈。 - Drazen Bjelovuk