提问者:小点点

在正则表达式中,匹配字符串的末尾或特定字符


我有一根绳子。结尾是不同的,例如索引。php?测试=1

我如何匹配它,无论是在字符串的中间还是在结尾处?到目前为止,我得到了[


共2个答案

匿名用户

使用:

/(&|\?)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

字符序列与单个字符或字符串结尾之间的匹配(当前场景)

*?([u SINGLE_CHAR_DELIMITER)]|$)模式(由João Silva建议)效率相当低,因为正则表达式引擎首先检查出现在惰性点模式右侧的模式,并且只有当它们不匹配时才会“扩展”惰性点模式。

在这些情况下,建议使用否定字符类(或POSIX对话中的括号表达式):

[&?]list=([^&]*)

见演示。细节

  • [

在不返回尾随单字符分隔符或字符串结尾的情况下检查是否存在尾随单字符分隔符

大多数正则表达式风格(包括从ECMAScript 2018开始的JavaScript)都支持lookarounds,即只有在模式匹配或不匹配时才返回true或false的结构。如果需要以相同字符开始和结束的连续匹配(请参见原始模式,它可能匹配以

在这种情况下,可以使用两种方法:

  • 带有包含正字符类的替换项的正前瞻:(?=[单字符分隔符]|$)
  • 只有一个负数字符类的负数前瞻:(?![^SINGLE\u CHAR\u DELIMITER)])

负前瞻解决方案效率更高一些,因为它不包含会增加匹配过程复杂性的替代组。OP解决方案看起来像

[&?]list=(.*?)(?=&|$)

[&?]list=(.*?)(?![^&])

看到这个正则表达式演示和另一个在这里。

当然,如果尾随分隔符是多字符序列,则只有正向前瞻解决方案才有效,因为[^yes]不会否定字符序列,但类中的字符(即[^yes]匹配任何字符,但yes)。