Regex 正则表达式:匹配所有内容,但不匹配特定的模式

Regex 正则表达式:匹配所有内容,但不匹配特定的模式,regex,Regex,我需要一个能够匹配所有内容的正则表达式,但是一个以特定模式开头的字符串(特别是index.php,以及后面的内容,比如index.php?id=2342343)只需匹配/^index\.php//code>,然后拒绝匹配它的任何内容。不是正则表达式专家,但我认为您可以从一开始就使用负前瞻,例如,^(?!foo)。*$不应与python中以foo开头的任何内容匹配: >>> import re >>> p='^(?!index\.php\?[0-9]+).*$'

我需要一个能够匹配所有内容的正则表达式,但是一个以特定模式开头的字符串(特别是
index.php
,以及后面的内容,比如
index.php?id=2342343

只需匹配
/^index\.php//code>,然后拒绝匹配它的任何内容。

不是正则表达式专家,但我认为您可以从一开始就使用负前瞻,例如,
^(?!foo)。*$
不应与python中以
foo开头的任何内容匹配:

>>> 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>
>>重新导入
>>>p='^(?!index\.php\?[0-9]+).$'
>>>s1='index.php?12345'
>>>重新匹配(p,s1)
>>>s2='index.html?12345'
>>>关于匹配(p,s2)

不使用正则表达式如何:

// In PHP
0 !== strpos($string, 'index.php')

您可以将
^
放在字符集的开头,以匹配除这些字符以外的任何字符

[^=]*

将匹配所有内容,但
=

正则表达式:匹配所有内容,但

  • 以特定模式开头的字符串(例如,任意-空,也-不以
    foo开头的字符串
    ):
    • 基于前瞻的NFA解决方案:
  • 针对不支持lookarounds的正则表达式引擎的基于否定字符类的解决方案:
  • 以特定模式结尾的字符串(例如,结尾为no
    world.
    ):
    • 基于查找的解决方案:
    • 前瞻解决方案:
    • POSIX解决方案:
  • 包含特定文本的字符串(例如,与包含
    foo
    的字符串不匹配):
    • 基于查找的解决方案:
    • POSIX解决方案:
      • 使用位于的在线正则表达式生成器
  • 包含特定字符的字符串(例如,避免匹配具有
    |
    符号的字符串):
  • 等于某个字符串的字符串(例如,不等于
    foo
    ):
    • 基于环顾的:
    • POSIX:
  • 字符序列
    • PCRE(匹配除cat以外的任何文本):或
    • 其他引擎允许查找:(或,
      (cat)|[^c]+(?:c(?!at)[^c]*)*(?:c(?!at)[^c]*)+[^c]*
      )然后用语言检查意味着:如果第1组匹配,则它不是我们需要的,否则,如果不是空的,则获取匹配值
  • 某些单个字符或一组字符
    • 使用:(除小写ASCII字母以外的任何字符)
    • 匹配任何字符,但
      |
演示说明:在演示中,换行符
\n
用于否定字符类中,以避免匹配溢出到相邻行。在测试单个字符串时,它们不是必需的

锚注:在许多语言中,使用
\A
定义字符串的明确开头,并使用
\z
(在Python中,它是
\z
,在JavaScript中,
$
是可以的)定义字符串的最末端

点注:在许多风格中(但不是POSIX、TRE、TCL),
匹配除换行符以外的任何字符。确保对
使用相应的DOTALL修饰符(
/s
在PCRE/Boost/.NET/Python/Java中,以及
/m
在Ruby中),以匹配任何字符,包括换行符

反斜杠注释:在必须使用允许转义序列的C字符串声明模式的语言中(如换行符的
\n
),需要将转义特殊字符的反斜杠加倍,以便引擎可以将其视为文字字符(例如,在Java中,
world\。
将被声明为
“world\\”
,或使用字符类:
“world[.]”
)。使用原始字符串文字(Python
r'\bworld\b'
),C#逐字字符串文字
@“world\”
,或类似于
/world\//code>的slashy字符串/regex文字符号

我需要一个能够匹配所有内容的正则表达式,但是除了字符串之外 从特定模式(特别是index.php)开始 接下来是什么,比如index.php?id=2343)

使用方法Exec

match,
arr=[],
myRe=/([\s\s]+)(?:index\.php\?id.+)/g;
var str='1〕http://regular-viragenia/index.php?id=2342343';
while((match=myRe.exec(str))!=null){
arr.push(匹配[1]);
} 

控制台日志(arr)
您希望不匹配的特定模式是什么?是否有原因导致您无法匹配您的模式,并且如果字符串匹配,则不执行某些操作?可能重复@ThomasOwens:这取决于。这取决于表达式的哪一部分应该被求反。如果整个表达式都要被求反,那么您就得到了一个分数。例如e、 如果您想编码“如果字符串不包含'Bruce'作为子字符串,那么请执行一些操作,您可以直接使用/Bruce/,并将否定放在正则表达式之外的if语句中。但也可能是你想否定一些子表达式。比如说,你正在寻找像firstname lastname这样的东西,firstname是Bruce,lastname是除了XYZ以外的所有东西,XYZ是一些名人的姓,叫做Bruce。这将拒绝“index_php”或“index#php”。这是真的,但它一次只处理一个字符。如果要排除由两个或更多字符组成的序列,必须像其他响应者所说的那样使用负前瞻。完美解决方案可以删除除模式中的字符以外的任何不需要的字符。thanks@Alan“…你必须使用消极的前瞻…”是不正确的,但我们不应该对你太苛刻,因为Wiktor直到201年才发布他的答案,这说明了原因