正则expression式:匹配一切,但
我需要一个正则expression式能够匹配一切, 但一个string以特定模式开始(特别是index.php
和以下,如index.php?id=2342343
)
不是一个正则expression式专家,但是我认为你可以从一开始就使用负面的lookahead,例如^(?!foo).*$
不应该匹配任何以foo
开头的东西。
你可以在字符集的开始处加一个^
来匹配除这些字符以外的任何内容。
[^=]*
将匹配一切,但=
正则expression式:匹配一切, 但 :
- 一个以特定模式开始的string (例如,任何 – 空,也是 – string不以
foo
开头):- 用于NFA的基于Lookahead的解决scheme:
-
^(?!foo).*$
-
^(?!foo)
-
- 不支持lookarounds的正则expression式引擎的基于字符类的解决scheme:
-
^(([^f].{2}|.[^o].|.{2}[^o]).*|.{0,2})$
-
^([^f].{2}|.[^o].|.{2}[^o])|^.{0,2}$
-
- 用于NFA的基于Lookahead的解决scheme:
- 一个以特定模式结尾的string (比如说,没有
world.
- 基于Lookbehind的解决scheme:
-
(?<!world\.)$
-
^.*(?<!world\.)$
-
- POSIX解决方法:
-
^(.*([^w].{5}|.[^o].{4}|.{2}[^r].{3}|.{3}[^l].{2}|.{4}[^d].|.{5}[^.])|.{0,5})$
-
([^w].{5}|.[^o].{4}|.{2}[^r].{3}|.{3}[^l].{2}|.{4}[^d].|.{5}[^.]$|^.{0,5})$
-
- 基于Lookbehind的解决scheme:
- 一个包含特定文本的string (比如不匹配一个有
foo
的string)(不符合POSIX的patern,对不起):-
^(?!.*foo)
-
^(?!.*foo).*$
-
- 一个包含特定字符的string (比如避免匹配一个带有
|
符号的string):-
^[^|]*$
-
- 一个string等于一些string (比如说,不等于
foo
):- 环视为主:
-
^(?!foo$)
-
^(?!foo$).*$
-
- POSIX:
-
^(.{0,2}|.{4,}|[^f]..|.[^o].|..[^o])$
-
- 环视为主:
- 一系列字符 :
- PCRE (匹配任何文本,但是
cat
):/cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/i
或/cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is
- 其他引擎允许lookarounds:(
(cat)|[^c]*(?:c(?!at)[^c]*)*
(或(?s)(cat)|(?:(?!cat).)*
或(cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*
),然后用语言来检查是否意味着:如果组1匹配,则不是我们所需要的,否则,如果不为空,则获取匹配值
- PCRE (匹配任何文本,但是
- 某个单个字符或一组字符 :
- 使用否定字符类 :
[^az]+
(除了小写ASCII字母以外的任何字符) - 匹配任何字符,但是
|
:[^|]+
- 使用否定字符类 :
演示说明 :在演示中使用否定字符类时使用了换行符\n
,以避免匹配溢出到相邻的行。 testing单个string时不需要它们。
锚注 :在许多语言中,使用\A
定义string的明确开始,而\z
(在Python中,它是\Z
,在JavaScript中$
是OK)来定义string的最后一个结尾。
点注 :在许多口味(但不是POSIX,TRE,TCL)中.
匹配任何字符, 但换行符字符。 确保你使用了对应的DOTALL修饰符(在PCRE / Boost / .NET / Python / Java和/m
中的/s
) .
以匹配包括换行符的任何字符。
反斜杠注意 :在语言中,必须使用允许转义序列的Cstring来声明模式(例如换行符为\n
),则需要将反斜杠的两倍转义为特殊字符,以便引擎可将其视为文字字符(例如,在Java中, world\.
将被声明为"world\\."
,或者使用一个字符类"world[.]"
)。 使用原始string文字(Python r'\bworld\b'
),C#逐字string文字@"world\."
,或像/world\./
这样的/world\./
string/正则expression式文字符号。
只要匹配/^index\.php/
然后拒绝任何匹配。
grep -v在shell中
!〜在perl中
请用其他语言添加更多内容 – 我将其标记为“社区Wiki”。
在python中:
>>> import re >>> p='^(?!index\.php\?[0-9]+).*$' >>> s1='index.php?12345' >>> re.match(p,s1) >>> s2='index.html?12345' >>> re.match(p,s2) <_sre.SRE_Match object at 0xb7d65fa8>
如何不使用正则expression式:
// In PHP 0 !== strpos($string, 'index.php')