JavaRush /จาวาบล็อก /Random-TH /นิพจน์ทั่วไปใน Java
terranum
ระดับ
Milan

นิพจน์ทั่วไปใน Java

เผยแพร่ในกลุ่ม
RegExนิพจน์ทั่วไปเป็นรูปแบบหนึ่งที่สามารถนำไปใช้กับข้อความได้ (สตริงใน Java) Java จัดให้มี แพ็คเกจ java.util.regexสำหรับการจับคู่นิพจน์ทั่วไป นิพจน์ทั่วไปมีความคล้ายคลึงกับภาษาโปรแกรม Perl มากและเรียนรู้ได้ง่ายมาก นิพจน์ทั่วไปตรงกับข้อความ (บางส่วน) หรือไม่ * หากนิพจน์ทั่วไปตรงกับข้อความ เราก็สามารถค้นหาได้ ** หากนิพจน์ทั่วไปเป็นแบบประสม เราจะทราบได้อย่างง่ายดายว่าส่วนใดของนิพจน์ทั่วไปตรงกับส่วนใดของข้อความ

ตัวอย่างแรก

นิพจน์ทั่วไป " [a-z] +" จะจับคู่ตัวอักษรพิมพ์เล็กทั้งหมดในข้อความ [a-z]หมายถึงอักขระใดๆ ตั้งแต่aถึงzรวม และ+หมายถึงอักขระ "หนึ่งตัวขึ้นไป" สมมติว่าเราระบุสตริง "รหัส 2 เรียนรู้การสอน java" วิธีการทำเช่นนี้ใน Java ขั้นแรกคุณต้องสร้างเทมเพลต:
import java.util.regex.*;
Pattern p = Pattern.compile([a-z]+);
ถัดไป คุณต้องสร้างmatcherข้อความโดยการส่งข้อความบนไดอะแกรม:
Matcher m = p.matcher(“code 2 learn java tutorial”);
หมายเหตุ: ไม่มีPatternConstructor Matcherเราสร้างมันขึ้นมาโดยใช้วิธีการPatternเรียน Pattern Class:วัตถุคลาสประกอบด้วยการเป็นตัวแทนของการแสดงออกปกติ คลาส Pattern ไม่ได้จัดเตรียมตัวสร้างสาธารณะใดๆ หากต้องการสร้างเทมเพลต คุณต้องเรียกหนึ่งในวิธีคงที่สาธารณะก่อน จากนั้นจึงส่งคืนอ็อบเจ็กต์ของPatternคลาส วิธีการเหล่านี้ใช้นิพจน์ทั่วไปเป็นอาร์กิวเมนต์ Matcher Class:วัตถุ Finder คือกลไกที่ตีความรูปแบบและดำเนินการจับคู่กับสตริงอินพุต เช่นเดียวกับPatternชั้นเรียนMatcherไม่มีตัวสร้างสาธารณะ คุณได้รับวัตถุโดยMatcherการเรียกวิธีการmatcherบนวัตถุคลาส Patternเมื่อเราทำตามขั้นตอนเหล่านี้เสร็จแล้ว และตอนนี้เรามี instance ของคลาสแล้วMatcher m เราก็สามารถตรวจสอบได้ว่าพบรูปแบบหรือไม่ และหากพบ จะอยู่ที่ตำแหน่งใด เป็นต้น m.matches()คืนค่าเป็นจริงหากรูปแบบตรงกับสตริงทั้งหมด มิฉะนั้นจะเป็นเท็จ m.lookingAt()คืนค่าเป็นจริงหากรูปแบบตรงกับจุดเริ่มต้นของสตริง หากไม่เป็นเช่นนั้นจะเป็นเท็จ m.find ()คืนค่าเป็นจริงหากรูปแบบตรงกับส่วนใดส่วนหนึ่งของข้อความ

การหาคู่ที่ตรงกัน

หลังจากการจับคู่สำเร็จm.start()จะส่งกลับดัชนีของอักขระตัวแรกที่ตรงกัน และm.end()จะส่งกลับดัชนีของอักขระตัวสุดท้ายที่ตรงกันบวกหนึ่ง หากพยายามไม่สำเร็จและไม่พบการแข่งขันm.start()พวกเขาm.end()จะโยนIllegalStateException
  • เท่านี้RuntimeExceptionคุณก็ไม่ต้องจับมันแล้ว
อาจดูแปลกที่จะm.end()ส่งคืนดัชนีของอักขระที่ตรงกันล่าสุดบวกหนึ่ง แต่นั่นคือสิ่งที่ส่วนใหญ่ของString.
  • ตัวอย่างเช่น,“Now is the time“.substring(m.start(), m.end())
จะส่งกลับสตริงเดียวกัน มาดูโค้ดกัน:
import java.util.regex.*;

public class RegexTest {
    public static void main(String args[]) {
        String pattern = "[a-z]+";
        String text = "code 2 learn java tutorial";
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(text);
        while(m.find()) {
            System.out.print(text.substring(m.start(), m.end()) + "*");
        }
    }
}
Output: code*learn*java*tutorial*

วิธีการเพิ่มเติม

หากมีการแข่งขันเกิดขึ้น:
  • m.replaceFirst(replacement)ส่งคืนสตริงใหม่ โดยที่สตริงย่อยแรกที่ตรงกับรูปแบบจะถูกแทนที่ด้วยreplacement
  • m.replaceAll(replacement)ส่งคืนสตริงใหม่ โดยแต่ละสตริงย่อยที่ตรงกับรูปแบบจะถูกแทนที่
  • m.find(StartIndex)ค้นหาคู่ถัดไปโดยเริ่มจากดัชนีที่ระบุ
  • m.reset()รีเซ็ตเทมเพลต
  • m.reset(NewText)รีเซ็ตตัวค้นหาและให้ข้อความใหม่ (อาจStringเป็นStringBufferหรือCharBuffer)

ไวยากรณ์นิพจน์ทั่วไป

  • ^ตรงกับจุดเริ่มต้นของบรรทัด
  • $จับคู่ส่วนท้ายของสตริง
  • .จับคู่อักขระเดี่ยวใดๆ ยกเว้นขึ้นบรรทัดใหม่ การใช้ตัวเลือก m ช่วยให้สามารถจับคู่การขึ้นบรรทัดใหม่ได้
  • [...]จับคู่อักขระเดี่ยวใดๆ ในวงเล็บ
  • [^ ...]จับคู่อักขระเดี่ยวใดๆ ที่ไม่อยู่ในวงเล็บ
  • \Aเริ่มต้นทั้งบรรทัด
  • \zสิ้นสุดทั้งบรรทัด
  • \Zจุดสิ้นสุดของบรรทัดทั้งหมด ยกเว้นจุดสิ้นสุดของบรรทัดสุดท้าย
  • re*จับคู่นิพจน์ก่อนหน้าตั้งแต่ 0 รายการขึ้นไป
  • re+ตรงกับนิพจน์ก่อนหน้าอย่างน้อยหนึ่งรายการ
  • re?จับคู่ 0 หรือ 1 กับตำแหน่งของนิพจน์ก่อนหน้า
  • re{n}ตรงกับ N จำนวนครั้งของนิพจน์ก่อนหน้า
  • re{n,}จับคู่ N รายการหรือมากกว่าของนิพจน์ก่อนหน้า
  • re{n, m}จับคู่อย่างน้อย n และไม่เกิน m รายการของนิพจน์ก่อนหน้า
  • a|bตรงกับ a หรือ b
  • (re)กลุ่มของนิพจน์ทั่วไปและการจดจำข้อความที่พบ
  • (?: re)กลุ่มของนิพจน์ทั่วไปที่ไม่จำข้อความที่พบ
  • (?> re)จับคู่รูปแบบอิสระโดยไม่มีผลตอบแทน
  • \wจับคู่ตัวอักษรและตัวเลข [a-zA-Z_0-9]
  • \Wสิ่งเหล่านี้ไม่ใช่ตัวอักษรหรือตัวเลข
  • \sจับคู่ช่องว่าง เทียบเท่ากับ [\t\n\r\f]
  • \Sไม่ใช่อักขระช่องว่าง
  • \dจับคู่ตัวเลข เทียบเท่ากับ [0-9]
  • \Dไม่ตรงกับตัวเลข.
  • \Gตรงกับแต้มนัดสุดท้าย
  • \nตรงกับการขึ้นบรรทัดใหม่
  • \bจับคู่ที่ขอบเขตคำ
  • \Bตรงกันไม่อยู่ในขอบเขตคำ
  • \n, \t, etc.ขึ้นบรรทัดใหม่ การขึ้นบรรทัดใหม่ แท็บ ฯลฯ
  • \Qอ้างอิงอักขระทั้งหมดก่อน \E
  • \Eใบเสนอราคาเริ่มต้นด้วย \Q ลงท้าย
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION