Regex: ไม่สนใจขนาดตัวพิมพ์


316

ฉันจะทำให้ regex ต่อไปนี้ไม่สนใจขนาดตัวพิมพ์ได้อย่างไร มันควรจะตรงกับตัวละครที่ถูกต้องทั้งหมด แต่ไม่สนใจว่าพวกเขาจะต่ำกว่าหรือตัวพิมพ์ใหญ่

G[a-b].*

เพียงแค่มีทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็กรวมอยู่ใน regex หรือแปลงเป็นตัวพิมพ์ใหญ่ก่อนทำการจับคู่ regex
Chetter Hummin

2
G [a-bA-B]. * จะเห็นได้ชัดในกรณีทั่วไปนี้ความไวของเคสขึ้นอยู่กับแพลตฟอร์ม afaik และคุณไม่ได้ให้แพลตฟอร์ม
Joachim Isaksson

16
หากคุณกำลังใช้ Java Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);คุณสามารถระบุนี้กับชั้นแบบนี้
james.garriss

ตัวเลือก Java เพิ่มเติมได้ที่นี่: blogs.oracle.com/xuemingshen/entry/…
james.garriss

โปรดทราบว่าสำหรับการเพิ่มgrepเป็นเพียงการเพิ่ม-iตัวปรับแต่ง ตัวอย่าง: grep -rni regular_expressionเพื่อค้นหา 'regular_expression' 'r'ecursively นี้ให้พิมพ์ตัวอักษร' i'nsensitive โดยแสดงบรรทัด 'n'umbers ในผลลัพธ์
Gabriel Staples

คำตอบ:


444

สมมติว่าคุณต้องการให้regex ทั้งหมดไม่สนใจเคสคุณควรมองหาiแฟล็ก เอ็นจิ้น regex เกือบทุกตัวรองรับ:

/G[a-b].*/i

string.match("G[a-b].*", "i")

ตรวจสอบเอกสารสำหรับภาษา / แพลตฟอร์ม / เครื่องมือของคุณเพื่อค้นหาวิธีการระบุโหมดการจับคู่

หากคุณต้องการเพียงส่วนหนึ่งของ regex ที่จะไม่คำนึงถึงขนาดตัวพิมพ์ (ตามคำตอบเดิมของฉันสันนิษฐาน) คุณมีสองตัวเลือก:

  1. ใช้(?i)ตัว(?-i)ดัดแปลงโหมดและ [เป็นทางเลือก] :

    (?i)G[a-b](?-i).*
  2. ใส่รูปแบบทั้งหมด (เช่นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่) ใน regex - มีประโยชน์หากไม่รองรับตัวดัดแปลงโหมด:

    [gG][a-bA-B].*

หมายเหตุสุดท้ายหนึ่ง: หากคุณกำลังจัดการกับอักขระ Unicode นอกเหนือจาก ASCII ให้ตรวจสอบว่าเอนจิน regex ของคุณรองรับอย่างถูกต้องหรือไม่


ยอดเยี่ยม! ใช้งานได้กับ: perl -pe 's / ^ utf-8 \? B \?. * $ // gi' Cancer.1631 การจับคู่ / แทนที่สตริง "UTF-8? B?" ในไฟล์ Cancer.1631 สิ่งนี้ล้มเหลว: perl -pe 's / ^ utf-8 \? B \?. * $ // g' Cancer.1631 เนื่องจากกรณีไม่ตรงกัน
Victoria Stuart

โพสต์นี้จะชัดเจนกว่านี้หากไม่ใช่ตัวอย่างที่เฉพาะเจาะจง ชอบถ้าคุณต้องการละเว้นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่สำหรับคำอื่นเช่น ".txt" และ ".TXT" จากการดูคำตอบนี้ฉันยังไม่แน่ใจว่าฉันจะทำสิ่งนี้ได้อย่างไร
Kyle Bridenstine

ด้วยเหตุผลบางอย่าง regex ที่คุณโพสต์ไม่ทำงานในfindExtended Regex .. ตัวอย่างเช่นfind . \( -type d -regextype posix-extended -regex '/./[a-c][^.]*/i' \)จะไม่แสดงโฟลเดอร์ใด ๆ .. สีขาว reged ที่คล้ายกันfind . \( -type d -regextype posix-extended -regex './[a-c][^.]*' \)โดยไม่มีตัวดัดแปลงจะแสดงโฟลเดอร์ที่ถูกต้อง มีความคิดอะไรไหม?
alpha_989

ที่นี่ฉันพยายามค้นหาโฟลเดอร์ทั้งหมดที่เริ่มต้นด้วยอักขระ[a-c]ในโฟลเดอร์ปัจจุบันเท่านั้น .. เพื่อทำการจัดการเพิ่มเติม ..
alpha_989

สุจริตฉันใส่ตัวเลือก 2 ในส่วนหลักของคำตอบเพราะมันเป็นเรื่องทั่วไปและทำงานร่วมกับเครื่องมือ regex ทั้งหมด
Puterdo Borato

154

ขึ้นอยู่กับการนำไปใช้ แต่ฉันจะใช้

(?i)G[a-b].

ผันแปร:

(?i) case-insensitive mode ON    
(?-i) case-insensitive mode OFF

รสชาติ regex สมัยใหม่ช่วยให้คุณสามารถปรับใช้กับส่วนหนึ่งของการแสดงออกปกติ หากคุณแทรกโมดิฟายเออร์ (? im) ตรงกลางของ regex โมดิฟายเออร์จะใช้กับส่วนของ regex ทางด้านขวาของโมดิฟายเออร์เท่านั้น ด้วยรสชาติเหล่านี้คุณสามารถปิดโหมดโดยนำหน้าด้วยเครื่องหมายลบ (? -i)

คำอธิบายมาจากหน้าเว็บ: https://www.regular-expressions.info/modifiers.html


นี่เป็นรูปแบบตัวดัดแปลงสำหรับเอ็นจิน Search regex ของ TortoiseHg
mwolfe02

คุณสามารถบอกฉันได้ว่าสิ่งนี้สามารถทำได้ในเชลล์ Linux (พูดใน egrep โดยไม่ต้องใช้สวิตช์ "-i") โดยทั่วไป?
กฤษณะ Gupta

1
การอธิบายสิ่งที่(?i)ทำและวิธีสิ้นสุด ( (?-i)) จะเป็นประโยชน์จริง ๆ นั่นเป็นเหตุผลที่ทำไมคำตอบของคุณจึงมีคะแนนโหวต 1/3 มากกว่าคำถาม # 1 แทนที่จะเป็นเกือบมากเพราะพวกเขาอธิบายรายละเอียดที่ลึกซึ้งนี้
Gabriel Staples

55

นิพจน์ทั่วไปสำหรับตรวจสอบความถูกต้องของ 'abc' โดยไม่สนใจขนาดตัวพิมพ์

(?i)(abc)

1
ทำงานอย่างสมบูรณ์แบบกับ Android Studio logcat
โจ

ทำงานในหลามด้วย
conner.xyz

47

iธงโดยปกติจะใช้สำหรับกรณีที่ไม่รู้สึก คุณไม่ให้ภาษาที่นี่ แต่มันอาจจะเป็นสิ่งที่ชอบหรือ/G[ab].*/i/(?i)G[ab].*/


15

เพื่อความสมบูรณ์ฉันต้องการเพิ่มโซลูชันสำหรับนิพจน์ทั่วไปใน C ++ ด้วย Unicode:

std::tr1::wregex pattern(szPattern, std::tr1::regex_constants::icase);

if (std::tr1::regex_match(szString, pattern))
{
...
}

1
บางคนสามารถอธิบายให้ฉันฟังได้ว่าเพราะเหตุใดโพสต์นี้จึงถูกลดระดับลง โซลูชันที่ยอมรับใช้รหัสเฉพาะและเพื่อความสมบูรณ์ฉันต้องการเพิ่มโซลูชันสำหรับไลบรารีมาตรฐานของภาษา c ++ ในความคิดของฉันฉันได้สร้างมูลค่าเพิ่มให้กับคำถามทั่วไปมากขึ้น
Frankenstein

5

ขณะที่ผมค้นพบจากการโพสต์นี้คล้ายกัน ( IgnoreCase ใน AWK ) ในรุ่นเก่า awk (เช่นในวานิลลา Mac OS X), 'tolower($0) ~ /pattern/'คุณอาจจำเป็นต้องใช้

IGNORECASEหรือ(?i)หรือ/pattern/iอาจสร้างข้อผิดพลาดหรือคืนค่าจริงสำหรับทุกบรรทัด


2

ค#

using System.Text.RegularExpressions;
...    
Regex.Match(
    input: "Check This String",
    pattern: "Regex Pattern",
    options: RegexOptions.IgnoreCase)

โดยเฉพาะ: ตัวเลือก: RegexOptions.IgnoreCase


1

[gG] [aAbB]. * อาจจำลองวิธีการแก้ปัญหาหากรูปแบบไม่ซับซ้อนหรือยาวเกินไป


จะรักที่จะรู้ว่าทำไมคำตอบนี้ไม่ถูกต้องสำหรับคำถามที่ได้รับ?
alpha_989

คุณมีในคำตอบของคุณ "ไม่ซับซ้อนเกินไปหรือนานเกินไป"
35799

นี่เป็นทางออกเดียวที่เหมาะกับกรณีของฉัน ดูเหมือนว่าโซลูชันทั่วไปที่ควรทำงานได้ทุกที่ คำตอบอื่น ๆ ดูเหมือนจะเฉพาะเจาะจงมากสำหรับการใช้งาน regex โดยเฉพาะ
Puterdo Borato

1

นอกเหนือจากคำตอบที่ยอมรับแล้ว:

การใช้ Grep:

โปรดทราบว่าสำหรับการเพิ่มgrepเป็นเพียงการเพิ่ม-iตัวปรับแต่ง ตัวอย่าง: grep -rni regular_expressionเพื่อค้นหา 'regular_expression' 'r'ecursively นี้ให้พิมพ์ตัวอักษร' i'nsensitive โดยแสดงบรรทัด 'n'umbers ในผลลัพธ์

นอกจากนี้ยังเป็นเครื่องมือที่ยอดเยี่ยมสำหรับการยืนยันนิพจน์ทั่วไป: https://regex101.com/

เช่นดูการแสดงออกและคำอธิบายในภาพนี้

ป้อนคำอธิบายรูปภาพที่นี่

อ้างอิง:


0

ใน Java คอนRegexสตรัคมี

Regex(String pattern, RegexOption option)

เพื่อที่จะไม่สนใจกรณีใช้

option = RegexOption.IGNORE_CASE

0

คุณสามารถฝึก Regex ใน Visual Studio และ Visual Studio Code โดยใช้ find / replace

คุณต้องเลือกทั้งการจับคู่กรณีและนิพจน์ปกติสำหรับนิพจน์ regex กับกรณีและปัญหา มิฉะนั้น [AZ] จะไม่ทำงานคำอธิบายภาพป้อนที่นี่

Visual Studio 2019 ชุมชน


-2

คุณยังสามารถนำสตริงเริ่มต้นของคุณซึ่งคุณจะตรวจสอบการจับคู่รูปแบบเพื่อเป็นตัวพิมพ์เล็ก และใช้ในรูปแบบสัญลักษณ์ตัวพิมพ์เล็กของคุณตามลำดับ

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