\p{InCombiningDiacriticalMarks}
เป็นคุณสมบัติบล็อก Unicode ใน JDK7 คุณจะสามารถเขียนได้โดยใช้สัญกรณ์สองส่วน\p{Block=CombiningDiacriticalMarks}
ซึ่งอาจชัดเจนกว่าสำหรับผู้อ่าน เป็นเอกสารที่นี่ใน UAX # 44:“การ Unicode ตัวฐานข้อมูล”
ความหมายคือจุดรหัสอยู่ในช่วงหนึ่งซึ่งเป็นบล็อกที่ได้รับการจัดสรรให้ใช้สำหรับสิ่งต่างๆตามชื่อนั้น นี่เป็นแนวทางที่ไม่ดีเนื่องจากไม่มีการรับประกันว่าจุดรหัสในช่วงนั้นเป็นหรือไม่ใช่สิ่งใดสิ่งหนึ่งโดยเฉพาะและรหัสที่ชี้นอกบล็อกนั้นไม่ได้มีอักขระเหมือนกัน
ตัวอย่างเช่นมีตัวอักษรละตินอยู่ใน\p{Latin_1_Supplement}
บล็อกเช่นé, U + 00E9 อย่างไรก็ตามมีสิ่งที่ไม่ใช่อักษรละตินอยู่ที่นั่นด้วย และแน่นอนว่ายังมีอักษรละตินอยู่ทั่วทุกแห่ง
บล็อกแทบไม่เคยเป็นสิ่งที่คุณต้องการ
ในกรณีนี้ฉันสงสัยว่าคุณอาจต้องการใช้อสังหาริมทรัพย์\p{Mn}
หรือที่เรียก\p{Nonspacing_Mark}
ว่า จุดรหัสทั้งหมดในบล็อก Combining_Diacriticals เป็นประเภทนั้น นอกจากนี้ยังมี (ณ Unicode 6.0.0) 1087 Nonspacing_Marks ที่ไม่ได้อยู่ในบล็อกนั้น
เกือบจะเหมือนกับการตรวจสอบ\p{Bidi_Class=Nonspacing_Mark}
แต่ไม่มากนักเนื่องจากกลุ่มนั้นมีเครื่องหมายปิดล้อม\p{Me}
ด้วย หากคุณต้องการทั้งสองอย่างคุณสามารถพูดได้ว่า[\p{Mn}\p{Me}]
คุณกำลังใช้ Java regex engine หรือไม่เนื่องจากมันให้การเข้าถึงคุณสมบัติ General_Category เท่านั้น
คุณต้องใช้ JNI เพื่อไปที่ไลบรารี ICU C ++ regex แบบเดียวกับที่ Google ทำเพื่อเข้าถึงบางอย่างเช่น\p{BC=NSM}
ตอนนี้มีเพียง ICU และ Perl เท่านั้นที่ให้การเข้าถึงคุณสมบัติ Unicode ทั้งหมด ไลบรารี regex Java ปกติรองรับคุณสมบัติ Unicode มาตรฐานเพียงสองสามคุณสมบัติ ใน JDK7 แม้ว่าจะมีการรองรับ Unicode Script ที่เหมาะสมซึ่งเป็นที่นิยมอย่างมากสำหรับคุณสมบัติ Block ดังนั้นคุณสามารถใน JDK7 เขียน\p{Script=Latin}
หรือ \p{SC=Latin}
หรือทางลัด\p{Latin}
เพื่อรับอักขระใดก็ได้จากสคริปต์ละติน นำไปสู่การนี้มาก[\p{Latin}\p{Common}\p{Inherited}]
ที่จำเป็นโดยทั่วไป
โปรดทราบว่านั่นจะไม่ลบสิ่งที่คุณอาจคิดว่าเป็นเครื่องหมาย "เน้นเสียง" ออกจากตัวอักษรทั้งหมด! มีหลายอย่างที่จะไม่ทำเพื่อ ตัวอย่างเช่นคุณไม่สามารถแปลงĐเป็นDหรือøเป็นoวิธีนั้นได้ เพื่อที่คุณจะต้องลดจุดรหัสเป็นจุดที่ตรงกับความแรงในการเรียงหลักเดียวกันในตารางการเรียงแบบ Unicode
อีกสถานที่หนึ่งที่\p{Mn}
สิ่งนี้ล้มเหลวแน่นอนว่ามีการปิดเครื่องหมายเหมือน\p{Me}
อย่างเห็นได้ชัด แต่ก็มี\p{Diacritic}
อักขระที่ไม่ใช่เครื่องหมาย น่าเศร้าที่คุณต้องการการสนับสนุนด้านทรัพย์สินอย่างเต็มที่ซึ่งหมายความว่า JNI ไปที่ ICU หรือ Perl Java มีปัญหามากมายกับการรองรับ Unicode ฉันกลัว
เดี๋ยวก่อนฉันเห็นว่าคุณเป็นชาวโปรตุเกส คุณไม่ควรมีปัญหาใด ๆ เลยหากคุณกำลังจัดการกับข้อความภาษาโปรตุเกสเท่านั้น
อย่างไรก็ตามคุณไม่ต้องการลบสำเนียงออกไปฉันพนันได้เลย แต่คุณต้องการที่จะจับคู่สิ่งที่“ ไม่เน้นเสียง” ใช่ไหม? ถ้าเป็นเช่นนั้นคุณสามารถทำได้โดยใช้ICU4J (ICU สำหรับ Java) ระดับ หากคุณเปรียบเทียบที่จุดแข็งหลักเครื่องหมายเน้นเสียงจะไม่นับ ฉันทำสิ่งนี้ตลอดเวลาเพราะฉันมักประมวลผลข้อความภาษาสเปน ฉันมีตัวอย่างวิธีการทำเช่นนี้สำหรับคนสเปนที่นั่งอยู่ที่นี่ถ้าคุณต้องการ