ฉันต้องการ regex สามารถจับคู่ทุกอย่างแต่สตริงเริ่มต้นด้วยรูปแบบเฉพาะ (โดยเฉพาะindex.php
และสิ่งต่อไปนี้เช่นindex.php?id=2342343
)
ฉันต้องการ regex สามารถจับคู่ทุกอย่างแต่สตริงเริ่มต้นด้วยรูปแบบเฉพาะ (โดยเฉพาะindex.php
และสิ่งต่อไปนี้เช่นindex.php?id=2342343
)
คำตอบ:
ไม่ได้เป็นผู้เชี่ยวชาญ regexp แต่ฉันคิดว่าคุณสามารถใช้ lookahead เชิงลบจากการเริ่มต้นเช่นไม่ควรตรงกับสิ่งที่เริ่มต้นด้วย^(?!foo).*$
foo
^((?!foo).)*$
( stackoverflow.com/a/406408/3964381 )
Regex: จับคู่ทุกอย่างแต่ :
foo
):
world.
ที่สิ้นสุด):
foo
) (ไม่ POSIX patern ตามขออภัย):
|
สัญลักษณ์):
foo
):
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 ตัวพิมพ์เล็ก)|
:[^|]+
ตัวอย่างการสาธิต : การขึ้นบรรทัดใหม่\n
จะใช้ภายในคลาสอักขระที่ถูกทำให้เป็นโมฆะในการสาธิตเพื่อหลีกเลี่ยงการจับคู่โอเวอร์โฟลว์กับแถวที่อยู่ใกล้เคียง ไม่จำเป็นเมื่อทำการทดสอบแต่ละสตริง
Anchor note : ในหลาย ๆ ภาษาให้ใช้\A
เพื่อกำหนดจุดเริ่มต้นของสตริงที่ไม่คลุมเครือและ\z
(ใน Python คือ\Z
ใน JavaScript $
คือ OK) เพื่อกำหนดจุดสิ้นสุดของสตริง
Dot หมายเหตุ : ในรสชาติมาก ( แต่ไม่ POSIX, TRE, TCL) .
ตรงกับถ่านใด ๆแต่การขึ้นบรรทัดใหม่ถ่าน ตรวจสอบให้แน่ใจว่าคุณใช้ตัวดัดแปลง DOTALL ที่สอดคล้องกัน ( /s
ใน PCRE / Boost / .NET / Python / Java และ/m
Ruby) เพื่อ.
ให้ตรงกับอักขระใด ๆ รวมถึงการขึ้นบรรทัดใหม่
บันทึกทับขวา : ในภาษาที่คุณมีการประกาศรูปแบบกับสตริง C ช่วยให้ลำดับหนี (เช่น\n
สำหรับการขึ้นบรรทัดใหม่), คุณต้องดับเบิล backslashes หนีตัวอักษรพิเศษเพื่อให้เครื่องยนต์สามารถรักษาพวกเขาเป็นตัวละครตัวอักษร (เช่นใน Java world\.
จะ ประกาศให้เป็น"world\\."
หรือใช้ตัวอักษรชั้นเรียน: "world[.]"
) ใช้ตัวอักษรของสตริงดิบ (งูใหญ่r'\bworld\b'
), C # คำต่อคำอักษรของสตริง@"world\."
หรือสตริง slashy / regex /world\./
ตัวอักษรสัญลักษณ์เช่น
^(?!foo$)
ทำไมเครื่องหมายดอลลาร์ต้องอยู่ในวงเล็บเพื่อให้นิพจน์ทำงานได้ ฉันคาดหวังว่า^(?!foo)$
จะให้ผลลัพธ์เดียวกัน แต่ไม่ได้
$
สมออยู่ภายใน lookahead มันเป็นส่วนหนึ่งของเงื่อนไขที่เป็นส่วนหนึ่งของที่ยืนยันเป็นศูนย์ที่มีความกว้าง ถ้ามันอยู่ข้างนอกเหมือนข้างใน^(?!foo)$
มันจะเป็นส่วนหนึ่งของรูปแบบการบริโภคที่ต้องการจุดสิ้นสุดของสตริงหลังจากเริ่มต้นของสตริงทำให้การลบ lookahead เชิงลบไม่เกี่ยวข้องเนื่องจากมันจะกลับมาจริงเสมอ(ไม่มีข้อความใด ๆ หลังจากสิ้นสุดของสตริง ให้นับประสาfoo
) ดังนั้นการ^(?!foo$)
จับคู่เริ่มต้นของสตริงที่ไม่ได้ตามด้วยfoo
ที่ตามด้วยปลายสาย ^(?!foo)$
ตรงกับสตริงว่าง
cot
หรือและลบการแข่งขันเช่นlan
regex.replace(myString, "^.*?(?:cot|lan)\s*", "")
คุณสามารถใส่ a ^
ในส่วนเริ่มต้นของชุดอักขระเพื่อจับคู่อะไรก็ได้ยกเว้นอักขระเหล่านั้น
[^=]*
จะจับคู่ทุกอย่าง แต่ =
เพียงแค่จับคู่/^index\.php/
จากนั้นปฏิเสธสิ่งที่ตรงกัน
str !~ /\Aindex\.php/
บางทีเขียน
ในหลาม:
>>> 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>
ฉันต้องสามารถ regex จะตรงกับทุกอย่างแต่ยกเว้นสตริงที่เริ่มต้นด้วย
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);
วิธีที่จะไม่ใช้ regex:
// In PHP
0 !== strpos($string, 'index.php')
grep
คำสั่งในบรรทัดคำสั่งหรือ Perl / Python / ภาษาอื่น ๆ หรือคำสั่ง "Execute regex นี้สำหรับทุกบรรทัด" ในโปรแกรมแก้ไขข้อความ ฯลฯ ... )