天天看點

php正規表達式除什麼之外,正規表達式:比對除特定模式以外的所有内容

我需要一個能夠比對除以特定模式(特别是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 /任何其他語言,或者在文本編輯器中使用"為每行執行此正規表達式"指令等)。