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

Regex 在正则表达式中,匹配字符串的结尾或特定字符,regex,pattern-matching,Regex,Pattern Matching,我有一根绳子。结尾是不同的,例如index.php?test=1&list=UL或index.php?list=UL&more=1。我要找的是&list= 如何匹配它,无论是在字符串的中间还是在结尾处?到目前为止,我已经得到了[&| \?]list=.*([&|$]),但是([&|$])部分实际上不起作用;我试图使用它来匹配&或字符串的结尾,但字符串的结尾部分不起作用,因此此模式匹配第二个示例,但不匹配第一个示例。使用: /(&|\?)list=.*?(&|$)/ 请注意,使用

我有一根绳子。结尾是不同的,例如
index.php?test=1&list=UL
index.php?list=UL&more=1
。我要找的是
&list=

如何匹配它,无论是在字符串的中间还是在结尾处?到目前为止,我已经得到了
[&| \?]list=.*([&|$])
,但是
([&|$])
部分实际上不起作用;我试图使用它来匹配
&
或字符串的结尾,但字符串的结尾部分不起作用,因此此模式匹配第二个示例,但不匹配第一个示例。

使用:

/(&|\?)list=.*?(&|$)/

请注意,使用括号表达式时,其中的每个字符(例外情况除外)都将按字面解释。换句话说,
[&|$]
匹配字符
&
$

[…]
中的任何零宽度断言都失去了零宽度断言的含义
[\b]
与单词边界不匹配(它匹配一个退格,或者在POSIX中,
\
b
),
[$]
匹配一个文本
$
字符,
[^]
要么是一个错误,要么是任何字符,就像在ECMAScript正则表达式中一样。与
\z
\z
\A
锚相同

您可以使用以下任一模式解决此问题:

[&?]list=([^&]*)
[&?]list=(.*?)(?=&|$)
[&?]list=(.*?)(?![^&])
如果您需要检查“绝对”的、明确的字符串结束锚点,您需要记住这是不同的正则表达式风格,它用不同的构造表示:

<代码> []?list =(.*)(?=和$)- ECMA正则表达式(OK),JOScript,默认C++(STD:::ReEXX) [&?]list=(.*?(=&&|\z)-OK for.NET、Go、Onigom(Ruby)、Perl、PCRE(PHP、base R)、Boost、ICU(R`stringr`)、Java/android [&?]list=(.*?(=&|\Z)-对Python来说可以
字符序列与单个字符或字符串结尾之间的匹配(当前场景)

*?([u SINGLE\u CHAR\u DELIMITER)]|$)
模式()效率很低,因为正则表达式引擎首先检查出现在惰性点模式右侧的模式,并且只有当它们不匹配时才会“扩展”惰性点模式

在这些情况下,建议使用(或POSIX talk中的括号表达式):

详细信息

  • [&?]
    -与
    &
    匹配的正字符类(注意字符类中字符/字符范围之间的关系为或关系)
  • list=
    -子字符串,字符序列
  • ([^&]*)
    -捕获组#1:除
    &
    [^&]
    )之外的零个或多个(
    *
    )字符,尽可能多
在不返回尾随单字符分隔符或字符串结尾的情况下检查尾随单字符分隔符的存在

大多数正则表达式风格(包括从ECMAScript 2018开始的JavaScript)都支持lookarounds,即只有在模式匹配或不匹配时才返回true或false的结构。如果需要以相同字符开始和结束的连续匹配(请参见原始模式,它可能匹配以
&
开始和结束的字符串),则它们非常重要。虽然查询字符串中不需要它,但这是一种常见的情况

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

  • 带有包含正字符类的替换项的正前瞻:
    (?=[单字符分隔符]|$)
  • 只有一个负数字符类的负数前瞻:
    (?![^SINGLE\u CHAR\u DELIMITER)])
负前瞻解决方案效率更高一些,因为它不包含会增加匹配过程复杂性的替代组。OP解决方案看起来像

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

见和


当然,如果尾随定界符是多字符序列,则只有正向前瞻解决方案会起作用,因为
[^yes]
不会否定字符序列,但类内的字符(即
[^yes]
匹配任何字符,但
y
e
s
)。

谢谢;我不知道方括号中的“按字面解释”部分。非常有用!因此,要使用
|
分隔两个或多个字符,是否需要
()
?是的,确实需要将(
()
)备选字符分组。@DrazenBjelovuk您的意思可能是(将
文本作为输出)。请看,每个解决方案都包含一个捕获组,用于捕获在返回匹配后通常作为第一个组获得的所需子匹配。@WiktorStribiżew事后看来,我的意思似乎是
string.match(/Some.*?(\/|$)/)[0]。不知道这一点的目的是什么虽然lol.@DrazenBjelovuk是的,惰性点匹配将匹配到后续子模式的最左边出现。这应该是公认的答案,imho,否定字符解决方案正是需要的,但更通用(即,可能适用于搜索类似问题的其他用户)。
[&?]list=(.*?)(?=&|$)
[&?]list=(.*?)(?![^&])