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