นิพจน์ปกติ - จับคู่สิ่งใด ๆ


278

ฉันจะทำให้การแสดงออกเพื่อให้ตรงกับอะไรอย่างแน่นอน (รวมถึงช่องว่าง)?
ตัวอย่าง:

Regex: ฉันซื้อ _____ แกะ

การแข่งขัน:ฉันซื้อแกะ ฉันซื้อแกะ ฉันซื้อแกะห้าตัว

ฉันพยายามใช้(.*)แต่ดูเหมือนจะไม่ทำงาน

อัปเดต: ฉันได้มาเพื่อทำงานดูเหมือนว่าปัญหาไม่ได้เกิดจากการแสดงออกปกติมันเป็นเพียงแค่ตัวละคร (.) ที่กำลังหลบหนี


27
.*ควรทำงาน. คุณสามารถวางรหัสจริงของคุณได้ไหม
Jacob Eggers

2
คุณเขียนด้วยภาษาอะไร
Ziggy

9
จุดไม่ตรงกับขึ้นบรรทัดใหม่
zee

คำตอบ:


293

ปกติจุดตรงกับตัวอักษรใด ๆยกเว้นการขึ้นบรรทัดใหม่

ดังนั้นหาก.*ไม่ทำงานให้ตั้งค่าตัวเลือก "จุดจับคู่ขึ้นบรรทัดใหม่ด้วย" (หรือใช้(?s).*)

หากคุณกำลังใช้งาน JavaScript ซึ่งไม่ได้มี "dotall ตัวเลือก" [\s\S]*ลอง ซึ่งหมายความว่า "จับคู่จำนวนอักขระใด ๆ ที่เป็นช่องว่างหรือไม่ใช่ช่องว่าง" - อย่างมีประสิทธิภาพ "จับคู่สตริงใด ๆ "

ตัวเลือกอื่นที่ใช้งานได้กับ JavaScript เท่านั้น (และไม่ได้รับการยอมรับจากรสชาติอื่น ๆ ของ regex) [^]*ซึ่งตรงกับสตริงใด ๆ แต่[\s\S]*ดูเหมือนว่าจะใช้กันอย่างแพร่หลายอาจเป็นเพราะพกพาได้มากกว่า


7
.*ไม่ตรง\nแต่มันจับสตริงที่มีเพียง\nเพราะมันตรงกับตัวอักษร 0
โตโต้

1
หากใช้ Javascript อย่าลืมเฉือนเครื่องหมายทับเมื่อตั้งค่าตัวแปรเป็นรูปแบบนี้เช่น: var pattern = "[\\ s \\ S] *";
Astra Bear

การ(?s).*ทำงานสำหรับฉันจับคู่ทุกอย่างรวมถึงบรรทัดใหม่
คุชราต Santana

1
มีปัญหาเมื่อใช้ / [\ s \ S] * / หากคุณใช้มันในรหัสของคุณแล้วใส่เครื่องหมายความคิดเห็นรหัสดังกล่าวที่ทำให้เกิดข้อผิดพลาดทางไวยากรณ์เพราะจุดสิ้นสุดของรูปแบบจะถูกนำไปหมายถึงจุดสิ้นสุดของความคิดเห็น จากนั้นคุณต้องลบรูปแบบนั้นออกจากรหัสความคิดเห็นเพื่อให้สามารถใช้งานได้ แต่ถ้าคุณไม่แสดงความคิดเห็นอีกครั้งมันจะไม่ทำงานอีกต่อไปหรือไม่ทำงานเหมือนที่เคยเป็นและควรทำ
Panu Logic

นี่จะเป็นกรณีที่ regex ใด ๆ ที่ลงท้ายด้วยเครื่องหมายดอกจัน แน่นอนว่ามันง่ายที่จะหลีกเลี่ยงโดยการเพิ่มอะไรบางอย่างหลังจาก*(เหมือนใน/.*(?:)/) หรือใช้ตัวสร้าง regex ( var foo = new RegExp(".*"))
ทิม Pietzcker

177

(.*?) ตรงกับสิ่งใด - ฉันใช้มันมาหลายปีแล้ว


61
แต่นั่นตรงกับบรรทัดใหม่หรือไม่
ineedahero

ฉันใช้สิ่งนี้กับ Sublime Text และมันทำงานได้อย่างสมบูรณ์ ขอบคุณ! ("title":".*?")
SCabralO

8
ใน Javascript ใช้หรือ[\s\S]* [^]*
Jeff Huijsmans

ฉันไม่รู้ แต่ทุกครั้งที่ฉันใช้สำนวนนี้ฉันรู้สึกผิดที่ไม่แสดงออกเฉพาะกรณีการใช้ของฉัน ถ้าพูดไม่พอผมสิ้นสุดการใช้w+ .+โชคดีที่ยังไม่กลับมากัดฉัน
Tushar

การทำงานสำหรับฉันใช้งูหลาม
ซุฟฟา

89

เลือก & จดจำ 1 อย่างต่อไปนี้ !!! :)

[\s\S]*
[\w\W]*
[\d\D]*

คำอธิบาย:

\s: ช่องว่าง\S: ไม่ใช่ช่องว่าง

\w: word \W: ไม่ใช่คำ

\d: หลัก\D: ไม่ใช่ตัวเลข

(คุณสามารถแลกเปลี่ยน*สำหรับ+ถ้าคุณต้องการ 1 ตัวอักษรหรือมากกว่า [แทน 0 หรือมากกว่า])




แก้ไขโบนัส:

หากคุณต้องการจับคู่ทุกอย่างในบรรทัดเดียวคุณสามารถใช้สิ่งนี้:

[^\n]+

คำอธิบาย:

^: ไม่

\n: linebreak

+: สำหรับ 1 ตัวอักษรขึ้นไป




4

เพราะ.หาตัวอักษรเดียวยกเว้น newline หรือ line terminator

ดังนั้นเพื่อให้ตรงกับสิ่งใดคุณสามารถใช้สิ่งนี้: (.|\n)*?

หวังว่ามันจะช่วย!


2

(.*?)ไม่ได้ผลสำหรับฉัน ฉันพยายามจับคู่ความคิดเห็นที่ล้อมรอบด้วย/* */ซึ่งอาจมีหลายบรรทัด

ลองสิ่งนี้:

([a]|[^a])

regex ตรงกับaหรือanything else expect aหรือแน่นอนมันหมายถึงการจับคู่ทุกอย่าง

BTW ในสถานการณ์ของฉัน /\*([a]|[^a])*/ตรงกับความคิดเห็นสไตล์ C

ขอบคุณ @mpen สำหรับวิธีที่กระชับกว่านี้

[\s\S]

1
วิธีที่พบได้บ่อยที่สุดใน JS คือ[\s\S]- คือการจับคู่กับที่ว่างและไม่ใช่ที่ว่าง
mpen

2

สำหรับ JavaScript คำตอบที่ดีที่สุดและง่ายที่สุดน่าจะเป็น /.*/

ตามที่คนอื่นแนะนำ /(.*?)/ จะทำงานได้ดี แต่ /.*/ นั้นง่ายกว่า () ภายในรูปแบบไม่จำเป็นเท่าที่ฉันจะเห็นหรือตอนจบ? เพื่อให้ตรงกับทุกอย่าง (รวมถึงสตริงว่าง)

NON-Solutions:

/ [\ s \ S] / ไม่ตรงกับสตริงว่างดังนั้นมันจึงไม่ใช่ทางออก

/ [\ s \ S] * / DOES จับคู่สตริงว่างเช่นกัน แต่มันมีปัญหา: ถ้าคุณใช้มันในรหัสของคุณคุณจะไม่สามารถออกความเห็นรหัสดังกล่าวได้เพราะ '* /' ถูกตีความว่าเป็นจุดสิ้นสุดของความคิดเห็น

/ ([\ s \ S] *) / ทำงานได้และไม่มีความคิดเห็นที่เป็นปัญหา แต่มันมีความยาวและซับซ้อนกว่าที่จะเข้าใจมากกว่า /.*/


BTW ดูเหมือนว่าโค้ดที่ตัดตอนมาข้างต้นทำให้ Stack Overflow แสดงส่วนของคำตอบของฉันเป็นตัวเอียงซึ่งไม่ใช่ความตั้งใจของฉัน
Panu Logic

1

หากคุณกำลังใช้ JavaScript, ES2018 เพิ่ม s (dotAll) ตั้งค่าสถานะ ด้วยการsตั้งค่าสถานะจุด.จะตรงกับตัวละครใด ๆ รวมถึงการขึ้นบรรทัดใหม่

console.log("line_1\nline_2".match(/.+/s))

หมายเหตุ : เบราว์เซอร์บางตัวยังไม่รองรับ


1

ข้อมูลจำเพาะ 2018 จัดเตรียมแฟล็กs (นามแฝง: dotAll) เพื่อให้.จับคู่กับอักขระใด ๆ รวมถึงการแบ่งบรรทัด:

const regExAll = /.*/s; //notice the 's'

let str = `
Everything
	in 	this
			string
					will
						be
	matched. Including whitespace (even Linebreaks).
`;

console.log(`Match:`, regExAll.test(str)); //true
console.log(`Index Location:`, str.search(regExAll));

let newStr = str.replace(regExAll,"🐔");
console.log(`Replaced with:`,newStr); //Index: 0

โค้ดข้างต้นงานใน Chrome แต่sธงยังไม่ได้ดำเนินการใน Firefox แต่มันจะเร็ว ๆ นี้



0

ฉันแนะนำให้ใช้ /(?=.*...)/g

ตัวอย่าง

const text1 = 'I am using regex';
/(?=.*regex)/g.test(text1) // true

const text2 = 'regex is awesome';
/(?=.*regex)/g.test(text2) // true

const text3 = 'regex is util';
/(?=.*util)(?=.*regex)/g.test(text3) // true

const text4 = 'util is necessary';
/(?=.*util)(?=.*regex)/g.test(text4) // false because need regex in text

ใช้regex101เพื่อทดสอบ


0

สุจริตมากคำตอบเก่าดังนั้นฉันพบว่าถ้าคุณเพียงแค่ทดสอบสตริงใด ๆ โดยไม่คำนึงถึงเนื้อหาของตัวละครด้วย "/.*/i" จะได้รับทุกอย่างเพียงพอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.