คำถาม regex ง่าย ๆ ฉันมีสตริงในรูปแบบต่อไปนี้:
this is a [sample] string with [some] special words. [another one]
การแสดงออกปกติเพื่อแยกคำภายในวงเล็บเหลี่ยมคืออะไร
sample
some
another one
หมายเหตุ: ในกรณีที่ฉันใช้งานวงเล็บไม่สามารถซ้อนกันได้
คำถาม regex ง่าย ๆ ฉันมีสตริงในรูปแบบต่อไปนี้:
this is a [sample] string with [some] special words. [another one]
การแสดงออกปกติเพื่อแยกคำภายในวงเล็บเหลี่ยมคืออะไร
sample
some
another one
หมายเหตุ: ในกรณีที่ฉันใช้งานวงเล็บไม่สามารถซ้อนกันได้
คำตอบ:
คุณสามารถใช้ regex ต่อไปนี้ได้ทั่วโลก :
\[(.*?)\]
คำอธิบาย:
\[: [เป็นเมตาชาร์และจำเป็นต้องหลบหนีหากคุณต้องการจับคู่อย่างแท้จริง(.*?) : จับคู่ทุกอย่างด้วยความโลภและจับมัน\]: ]เป็นเมตาชาร์และจำเป็นต้องหลบหนีหากคุณต้องการจับคู่อย่างแท้จริง[ ]ออกจากผลลัพธ์ (ผลลัพธ์)
(?<=\[).+?(?=\])
จะจับเนื้อหาโดยไม่ต้องใส่เครื่องหมายวงเล็บ
(?<=\[) - มองในเชิงบวกสำหรับ [
.*? - การจับคู่ที่ไม่โลภสำหรับเนื้อหา
(?=\]) - มองเชิงบวกสำหรับ ]
แก้ไข: สำหรับวงเล็บซ้อนกัน regex ด้านล่างควรทำงาน:
(\[(?:\[??[^\[]*?\]))
.ในนั้น ...
สิ่งนี้น่าจะใช้ได้ดี:
\[([^]]+)\]
วงเล็บสามารถซ้อนกันได้หรือไม่
ถ้าไม่: \[([^]]+)\]จับคู่หนึ่งรายการรวมถึงวงเล็บเหลี่ยม การอ้างอิงกลับ\1จะมีรายการที่จะจับคู่ หากรสชาติของ regex ของคุณรองรับการค้นหาให้ใช้
(?<=\[)[^]]+(?=\])
สิ่งนี้จะจับคู่รายการภายในวงเล็บเท่านั้น
/gแฟล็กใน JavaScript)
หากคุณไม่ต้องการรวมวงเล็บในการแข่งขันนี่คือ regex: (?<=\[).*?(?=\])
.ตรงกับตัวอักษรใด ๆ ยกเว้นจุดสิ้นสุดบรรทัด ?=เป็นlookahead บวก Lookahead เชิงบวกจะค้นหาสตริงเมื่อมีสตริงที่แน่นอนตามมา ?<=เป็นlookbehind บวก Lookbehind เชิงบวกจะค้นหาสตริงเมื่อมีสตริงที่นำหน้า ที่จะพูดนี้ ,
มองไปข้างหน้าในเชิงบวก (? =)
ค้นหา expression A โดยที่ expression B เป็นดังนี้:
A(?=B)ดูด้านหลังเป็นบวก (? <=)
ค้นหา expression A โดยที่ expression B นำหน้า:
(?<=B)A
หากโปรแกรม regex ของคุณไม่รองรับ lookaheads และ lookbehinds คุณสามารถใช้ regex \[(.*?)\]เพื่อจับอวัยวะภายในของวงเล็บในกลุ่มจากนั้นคุณสามารถจัดการกลุ่มได้ตามความจำเป็น
วงเล็บจับตัวละครในกลุ่ม การ.*?รับอักขระทั้งหมดระหว่างวงเล็บ (ยกเว้นสำหรับตัวยุติบรรทัดยกเว้นว่าคุณsเปิดใช้งานการตั้งค่าสถานะ) ในลักษณะที่ไม่โลภ
(?<=\[).*?(?=\])ใช้งานได้ดีตามคำอธิบายที่ให้ไว้ด้านบน นี่คือตัวอย่างของ Python:
import re
str = "Pagination.go('formPagination_bottom',2,'Page',true,'1',null,'2013')"
re.search('(?<=\[).*?(?=\])', str).group()
"'formPagination_bottom',2,'Page',true,'1',null,'2013'"
[]) ไม่ใช่วงเล็บ
ในกรณีที่คุณอาจมีวงเล็บที่ไม่สมดุลกันคุณสามารถออกแบบการแสดงออกด้วยการสอบถามซ้ำคล้ายกัน
\[(([^\]\[]+)|(?R))*+\]
แน่นอนว่ามันเกี่ยวข้องกับภาษาหรือเอนจิ้น RegEx ที่คุณอาจใช้งานอยู่
นอกเหนือจากที่,
\[([^\]\[\r\n]*)\]
หรือ,
(?<=\[)[^\]\[\r\n]*(?=\])
เป็นตัวเลือกที่ดีในการสำรวจ
หากคุณต้องการที่จะลดความซับซ้อน / การแก้ไข / การสำรวจการแสดงออกก็ถูกอธิบายอยู่ด้านบนขวาของแผงregex101.com หากคุณต้องการคุณสามารถดูได้ลิงค์นี้ว่ามันจะตรงกับอินพุตตัวอย่างบางส่วนได้อย่างไร
jex.imเห็นภาพการแสดงออกปกติ:
const regex = /\[([^\]\[\r\n]*)\]/gm;
const str = `This is a [sample] string with [some] special words. [another one]
This is a [sample string with [some special words. [another one
This is a [sample[sample]] string with [[some][some]] special words. [[another one]]`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
ถ้าคุณต้องการเติมเพียงตัวอักษรตัวอักษรขนาดเล็กระหว่างวงเล็บเหลี่ยม az
(\[[a-z]*\])
ถ้าคุณต้องการตัวพิมพ์เล็กและพิมพ์ใหญ่ a-zA-Z
(\[[a-zA-Z]*\])
ถ้าคุณต้องการตัวพิมพ์เล็กและตัวอักษรตัวเลข a-zA-Z0-9
(\[[a-zA-Z0-9]*\])
ถ้าคุณต้องการทุกอย่างระหว่างวงเล็บเหลี่ยม
ถ้าคุณต้องการข้อความตัวเลขและสัญลักษณ์
(\[.*\])
([[][a-z \s]+[]])
ข้างต้นควรทำงานตามคำอธิบายต่อไปนี้
อักขระภายในวงเล็บเหลี่ยม [] กำหนดคลาสอักขระซึ่งหมายความว่ารูปแบบควรตรงกับอักขระอย่างน้อยหนึ่งตัวที่กล่าวถึงภายในวงเล็บเหลี่ยม
\ s ระบุช่องว่าง
+ หมายถึงอย่างน้อยหนึ่งในตัวละครที่กล่าวถึงก่อนหน้านี้ถึง +
A-Zควรเพิ่มรูปแบบ: ([[][a-zA-Z \s]+[]]); ฉันคิดว่ามันเป็นวิธีที่ดีในขณะที่\ ในรูปแบบ regex ที่กำหนดในเครื่องหมายสตริง ("และ") และการผสมมือใหม่โดยการใช้แบ็กสแลชใน "หรือ" การใช้งาน!
std::regex pattern{R"(["][a-zA-Z \s]+["])"};
รหัสนี้จะแยกเนื้อหาระหว่างวงเล็บเหลี่ยมและวงเล็บ
(?:(?<=\().+?(?=\))|(?<=\[).+?(?=\]))
(?: non capturing group
(?<=\().+?(?=\)) positive lookbehind and lookahead to extract the text between parentheses
| or
(?<=\[).+?(?=\]) positive lookbehind and lookahead to extract the text between square brackets
ใน R ให้ลอง:
x <- 'foo[bar]baz'
str_replace(x, ".*?\\[(.*?)\\].*", "\\1")
[1] "bar"
gsub(pat, "\\1", x, perl=TRUE)ที่patคุณให้การแสดงออกปกติ ..
ฉันต้องการรวมถึงการขึ้นบรรทัดใหม่และรวมถึงวงเล็บ
\[[\s\S]+\]
ในการจับคู่สตริงย่อยระหว่างรายการแรก [และรายการสุดท้าย ]คุณสามารถใช้
\[.*\] # Including open/close brackets
\[(.*)\] # Excluding open/close brackets (using a capturing group)
(?<=\[).*(?=\]) # Excluding open/close brackets (using lookarounds)
ดูการสาธิต regexและการสาธิต regex # 2 2
ใช้นิพจน์ต่อไปนี้เพื่อจับคู่สตริงระหว่างวงเล็บเหลี่ยมที่ใกล้เคียงที่สุด :
รวมถึงวงเล็บ:
\[[^][]*]- PCRE, Python re/regex , .NET, Golang, POSIX (grep, sed, bash)\[[^\][]*]- ECMAScript (JavaScript, C ++ std::regex, VBA RegExp)\[[^\]\[]*] - Java regex\[[^\]\[]*\] - Onigmo (Ruby ต้องการการหลบหนีจากวงเล็บทุกที่)ไม่รวมวงเล็บ:
(?<=\[)[^][]*(?=])- PCRE, Python re/ regex, .NET (C #, ฯลฯ ), ICU (R stringr), ซอฟต์แวร์ JGSoft\[([^][]*)]- Bash , Golang - จับเนื้อหาระหว่างวงเล็บเหลี่ยมกับวงเล็บที่ไม่ใช้ค่า Escape ดูเพิ่มเติมที่ด้านล่าง\[([^\][]*)]- JavaScript , C ++std::regex , VBARegExp(?<=\[)[^\]\[]*(?=]) - Java regex(?<=\[)[^\]\[]*(?=\]) - Onigmo (Ruby ต้องการการหลบหนีจากวงเล็บทุกที่)หมายเหตุ : *ตรงกับ 0 ตัวอักษรขึ้นไปใช้+ไปเพื่อจับคู่ 1 ตัวหรือมากกว่าเพื่อหลีกเลี่ยงการจับคู่สตริงว่างในรายการ / แถวลำดับที่เป็นผลลัพธ์
เมื่อใดก็ตามที่มีการสนับสนุนการค้นหาทั้งสองวิธีโซลูชันด้านบนจะใช้เพื่อไม่รวมวงเล็บเปิด / ปิดนำหน้า / ต่อท้าย มิฉะนั้นให้ใช้การจับภาพกลุ่ม (ลิงก์ไปยังโซลูชันที่พบบ่อยที่สุดในบางภาษา)
หากคุณต้องการจับคู่วงเล็บที่ซ้อนกันคุณอาจเห็นวิธีแก้ปัญหาในนิพจน์ปกติเพื่อจับคู่เธรดวงเล็บที่มีความสมดุลและแทนที่วงเล็บเหลี่ยมด้วยวงเล็บสี่เหลี่ยมเพื่อให้ได้ฟังก์ชันที่จำเป็น คุณควรใช้การจับภาพกลุ่มเพื่อเข้าถึงเนื้อหาโดยไม่รวมวงเล็บเปิด / ปิด:
\[((?:[^][]++|(?R))*)]- PHP PCRE\[((?>[^][]+|(?<o>)\[|(?<-o>]))*)]- การสาธิต. NET\[(?:[^\]\[]++|(\g<0>))*\]- การสาธิต Onigmo (Ruby)
[^]]นั้นเร็วกว่า non-greedy (?) และยังทำงานร่วมกับรสชาติของ regex ที่ไม่รองรับ non-greedy อย่างไรก็ตามไม่ใช่โลภดูดีกว่า