正则表达式:匹配除特定模式以外的所有内容


310

我需要能够匹配一切正则表达式,但以特定模式开始的字符串(特别是index.php和下面,像index.php?id=2342343


您不希望匹配哪种特定模式?
Dominic Rodger

2
有什么原因不能匹配您的模式,并且如果字符串与之匹配则无法执行某些操作?
Thomas Owens


@ThomasOwens:取决于。这取决于应否定表达式的哪一部分。如果要否定整个表达式,那么您有意思了。例如,如果您要编写代码“如果字符串不包含'Bruce'作为子字符串,则执行某些操作”,则可以使用/ Bruce /,然后将否定符放入regex外的if语句中。但是可能是您想否定一些子表达式。假设您要寻找的名字是“姓氏”,其中“名字”是Bruce,“姓氏”是除XYZ以外的所有内容,其中XYZ是某个名人的姓氏,名为Bruce。
mathheadinclouds

Answers:


250

不是正则表达式专家,但我认为您可以从一开始就使用否定的前瞻功能,例如,^(?!foo).*$不应该匹配以开头的任何内容foo


7
与grep一起使用-P启用先行。
Seppo Enarvi,

如果您不希望“ foo”或“ bar”匹配,请检查以下答案: stackoverflow.com/a/2404330/874824
dave_k_smith

15
这个答案是错误的,快速测试表明。我想你的意思是^((?!foo).)*$stackoverflow.com/a/406408/3964381
吉拉德mayani

4
请您解释一下您使用的符号以及为什么使用它们吗?
rotimi-best,

339

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

演示说明:换行符\n在演示中的否定字符类内使用,以避免匹配溢出到相邻行。测试单个字符串时,它们不是必需的。

锚注:在许多语言中,用于\A定义字符串的明确开头,并且\z(在Python中为\Z,在JavaScript中$为OK)可以定义字符串的末尾。

点注释:在许多样式中(但不包括POSIX,TRE,TCL),都.匹配除换行符以外的任何字符。确保您使用相应的DOTALL修饰符(/s在PCRE / Boost / .NET / Python / Java和/mRuby中).来匹配任何包含换行符的字符。

反斜杠注:在您必须声明与C字符串允许转义序列(如模式语言\n的新行),你需要加倍反斜杠转义特殊字符,使得发动机可以把它们当作文字字符(例如在Java中,world\.将声明为"world\\.",或使用字符类:)"world[.]"。使用原始字符串文字(Python r'\bworld\b'),C#逐字字符串文字@"world\."或像这样的斜杠/正则表达式文字符号/world\./


大写!对于“一个字符串(不等于某个字符串)”,以的示例为例^(?!foo$),为什么必须在括号内包含美元符号才能使表达式起作用?我期望^(?!foo)$给出相同的结果,但事实并非如此。
格兰特·汉弗莱斯

3
@GrantHumphries:当$锚点位于前瞻区域内时,它是条件的一部分,是零宽度断言的一部分。如果它在外部(如in)^(?!foo)$,它将成为使用模式的一部分,要求在字符串开始后立即结束字符串,从而使负前行无关紧要,因为它始终返回true(字符串结束后不能有任何文本) ,更不用说foo)。因此,^(?!foo$)匹配不跟在foo后面的字符串的开头,再跟后面的字符串结尾。^(?!foo)$匹配一个空字符串。
WiktorStribiżew17年

@ robots.txt请删除这些注释。您正在询问XY问题。字符类用于匹配单个字符,无法用它们定义字符序列。您可能应该只找到字符串开头与cotor 的第一次出现之间的子字符串lan,然后删除匹配项,例如regex.replace(myString, "^.*?(?:cot|lan)\s*", "")
WiktorStribiżew19年

亲爱的维克多。您已关闭我的问题,但链接的答案失败。我已经更新了我的问题stackoverflow.com/questions/60004380/...
MonsterMMORPG

例如,您的链接答案在以下示例中失败:“将软件包<!-和网页<!-asdasasdas->编辑器现在使用-> Lorem Ipsum”
MonsterMMORPG

259

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

[^=]*

将匹配所有,但 =


55
是的,但是一次只能处理一个字符。如果要排除两个或多个字符的序列,则必须像其他响应者所说的那样使用负前瞻。
艾伦·摩尔

完美的解决方案TU去除任何不良性格,但那些图案。谢谢
Sirmyself

@Alan,“ ...您必须使用否定的前瞻...”是不正确的,但我们不应该对您太苛刻,因为Wiktor直到2016
卡里斯沃夫兰

6

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


也许是书面的str !~ /\Aindex\.php/
卡里·斯沃夫兰

6

在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>

3
那将拒绝“ index_php”或“ index#php”。

1

我需要一个正则表达式可以匹配所有,但除外一个字符串开始 index.php的特定模式(特别的index.php和下面,像的index.php?ID = 2342343)

使用方法Exec

    let match,
        arr = [],
        myRe = /([\s\S]+?)(?:index\.php\?id.+)/g;

    var str = 'http://regular-viragenia/index.php?id=2342343';

    while ((match = myRe.exec(str)) != null) {
         arr.push(match[1]);
    } 
    
    console.log(arr);

var myRe = /([\s\S]+?)(?:index\.php\?id=.+)/g;
var str = 'http://regular-viragenia/index.php?id=2342343';
var matches_array = myRe.exec(str);
console.log(matches_array[1]);

或其他比赛

let match,
            arr = [],
            myRe = /index.php\?id=((?:(?!index)[\s\S])*)/g;

        var str = 'http://regular-viragenia/index.php?id=2342343index.php?id=111index.php?id=222';

        while ((match = myRe.exec(str)) != null) {
             arr.push(match[1]);
        } 

        console.log(arr);


-13

如何不使用正则表达式:

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

11
OP特别要求使用正则表达式...我不确定这是否有帮助!(grep例如,他可能在命令行上使用Perl / Python /任何其他语言,或者在文本编辑器中使用“每行执行此正则表达式”命令等)
rinogo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.