我需要一个能够匹配除以特定模式(特别是index.php及其后的内容,例如index.php?id=2342343)开头的字符串之外的所有内容的正则表达式
您不希望匹配哪种特定模式?
是否有原因为什么您不能匹配您的模式,并且如果字符串与之匹配则无法执行某些操作?
正则表达式可能重复,以匹配不包含单词的行?
正则表达式:匹配所有内容,但:
以特定模式开头的字符串(例如,any-也为空-不是以foo开头的字符串):
基于先行的NFA解决方案:
^(?!foo).*$
^(?!foo)
用于正则表达式引擎的基于否定字符类的解决方案不支持环视:
^(([^f].{2}|.[^o].|.{2}[^o]).*|.{0,2})$
^([^f].{2}|.[^o].|.{2}[^o])|^.{0,2}$
以特定模式结尾的字符串(例如,末尾没有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})$
包含特定文本的字符串(例如,不匹配具有foo的字符串)(没有POSIX兼容模式,抱歉):
^(?!.*foo)
^(?!.*foo).*$
包含特定字符的字符串(例如,避免匹配具有|符号的字符串):
^[^|]*$
一个等于某个字符串的字符串(例如,不等于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
其他允许环视的引擎:(cat)|[^c]*(?:c(?!at)[^c]*)*(或(?s)(cat)|(?:(?!cat).)*或(cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*),然后使用语言进行检查,表示:如果第1组匹配,则不是我们所需要的,否则,如果不为空,则获取匹配值
某个单个字符或一组字符:
使用否定的字符类:[^a-z]+(除小写ASCII字母以外的任何字符)
匹配除|以外的任何字符:[^|]+
演示说明:换行符在演示中的否定字符类内使用,以避免匹配溢出到相邻行。测试单个字符串时,它们不是必需的。
锚注:在许多语言中,使用\A定义字符串的明确开头,并使用\z(在Python中为\z,在JavaScript中为$可以)定义字符串的最后。
点注释:在许多版本中(但不是POSIX,TRE,TCL),.匹配除换行符以外的任何字符。确保对.使用相应的DOTALL修饰符(在PCRE / Boost / .NET / Python / Java中为/s,在Ruby中为/m),以匹配包括换行符在内的任何字符。
反斜杠注意:在必须使用C字符串声明允许转义序列的模式的语言中(例如用于换行符),您需要将反斜杠加倍以转义特殊字符,以便引擎可以将它们视为文字字符(例如,在Java中) ,world\.将声明为"world\\.",或使用字符类:"world[.]")。使用原始字符串文字(Python r'\bworld\b'),C#逐字字符串文字@"world\."或斜线字符串/正则表达式文字符号,例如/world\./。
伟大的写作!对于"字符串(不等于某个字符串)"的情况,以^(?!foo$)为例,为什么必须在括号内包含美元符号才能使表达式起作用?我期望^(?!foo)$给出相同的结果,但事实并非如此。
@GrantHumphries:当$锚位于前瞻区域内时,它是条件的一部分,是零宽度断言的一部分。如果它在外部,如^(?!foo)$中那样,它将成为消耗模式的一部分,要求在字符串开始后立即结束字符串,使否定的前瞻无关紧要,因为它始终返回true(在字符串的结尾,更不用说foo)。因此,^(?!foo$)匹配不以foo开头的字符串的开头,该字符串以结尾的结尾。 ^(?!foo)$匹配一个空字符串。
@ robots.txt请删除这些注释。您在问一个XY问题。字符类用于匹配单个字符,无法用它们定义字符序列。您可能应该只找到字符串开头与第一次出现cot或lan之间的子字符串,然后删除匹配项,例如regex.replace(myString,"^.*?(?:cot|lan)\s*","")。
您可以在字符集的开头放置一个^以匹配那些字符以外的任何字符。
[^=]*
将匹配除=之外的所有内容
没错,但一次只能处理一个字符。如果要排除两个或多个字符的序列,则必须像其他响应者所说的那样使用负前瞻。
不是正则表达式专家,但我认为您可以从一开始就使用否定的前瞻功能,例如^(?!foo).*$不应与以foo开头的任何内容匹配。
与grep一起使用-P启用先行。
如果您期望的行为不匹配" foo"或" bar",请检查以下答案:stackoverflow.com/a/2404330/874824
这个答案是错误的,快速测试表明。我认为您的意思是^((?!foo).)*$(stackoverflow.com/a/406408/3964381)
请您解释一下您使用的符号以及为什么使用它们吗?
在python中:
>>> import re
>>> p='^(?!index\.php\?[0-9]+).*$'
>>> s1='index.php?12345'
>>> re.match(p,s1)
>>> s2='index.html?12345'
>>> re.match(p,s2)
那将拒绝" index_php"或" index#php"。
好点,忘了逃避。谢谢。
只需匹配/^index\.php/,然后拒绝任何匹配的内容。
为什么不做这项工作?
模式否定呢?
I need a regex able to match everything but except a string
starting with index.php a specific pattern (specifically index.php
and what follows, like 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);
grep -v在外壳中
!?在perl中
请添加其他语言的其他内容-我将此标记为社区Wiki。
OP特别要求使用正则表达式...我不确定这是否有帮助! (他当然有请求正则表达式的理由;他没有问,"我怎么能用任意技术解决这个问题?")
如何不使用正则表达式:
// In PHP
0 !== strpos($string, 'index.php')
OP特别要求使用正则表达式...我不确定这是否有帮助! (例如,他可能在命令行上使用grep或Perl / Python /任何其他语言,或者在文本编辑器中使用"为每行执行此正则表达式"命令等)。