ใน Java RegEx วิธีการหาความแตกต่างระหว่าง.
(dot) อักขระ meta และจุดปกติที่เราใช้ในประโยคใด ๆ วิธีการจัดการกับสถานการณ์ที่ตัวละครเมตาอื่น ๆ มากเกินไปเช่นนี้ ( *
, +
, \d
, ... )
ใน Java RegEx วิธีการหาความแตกต่างระหว่าง.
(dot) อักขระ meta และจุดปกติที่เราใช้ในประโยคใด ๆ วิธีการจัดการกับสถานการณ์ที่ตัวละครเมตาอื่น ๆ มากเกินไปเช่นนี้ ( *
, +
, \d
, ... )
คำตอบ:
หากคุณต้องการให้จุดหรือตัวละครอื่น ๆ ที่มีความหมายพิเศษใน regexes เป็นตัวละครปกติคุณจะต้องหลบมันด้วยแบ็กสแลช เนื่องจาก regexes ใน Java เป็นสตริง Java ปกติคุณจึงต้องหลีกเลี่ยงแบ็กสแลชเองดังนั้นคุณต้องมีแบ็กสแลชสองตัวเช่น\\.
การแก้ปัญหาที่เสนอโดยสมาชิกคนอื่นไม่ได้ผลสำหรับฉัน
แต่ฉันพบสิ่งนี้:
เพื่อหนีจุดใน java regexp เขียน [.]
\\.
ไม่ได้ทำงานสำหรับฉัน: \.
บ่นว่า.
ไม่จำเป็นที่จะต้องหนีไป\\.
ทำให้มันคิดว่ามันเป็น\.
แทน.
, \\\.
และสร้างโยนข้อผิดพลาดที่[.]
เป็นสิ่งเดียวที่ทำงาน
\\.
ในสตริงตัวอักษรให้คุณ\.
ซึ่งเป็นสิ่งที่ regex ต้องการดูจุดเป็นจุดตามตัวอักษรแทนการจับคู่ตัวละครใด ๆ
การแสดงออกปกติสไตล์ Perl (ซึ่งเอ็นจิน Java regex มากหรือน้อยตาม) ถือว่าตัวอักษรต่อไปนี้เป็นตัวอักษรพิเศษ:
.^$|*+?()[{\
มีความหมายพิเศษนอกคลาสอักขระ
]^-\
มีความหมายพิเศษภายในคลาสอักขระ ( [...]
)
ดังนั้นคุณต้องหลีกเลี่ยงสัญลักษณ์เหล่านั้น (และเหล่านั้นเท่านั้น) โดยขึ้นอยู่กับบริบท (หรือในกรณีของคลาสอักขระให้วางไว้ในตำแหน่งที่ไม่สามารถตีความผิด)
การหลีกเลี่ยงอักขระอื่นโดยไม่จำเป็นอาจใช้งานได้ แต่เอ็นจิน regex บางตัวจะถือว่านี่เป็นข้อผิดพลาดทางไวยากรณ์ตัวอย่างเช่น\_
จะทำให้เกิดข้อผิดพลาดใน. NET
บางคนอื่น ๆ จะนำไปสู่ผลลัพธ์ที่ผิดตัวอย่างเช่น\<
ถูกตีความว่าเป็นตัวอักษร<
ใน Perl แต่ในegrep
นั้นหมายถึง "ขอบเขตของคำ"
ดังนั้นการเขียน-?\d+\.\d+\$
เพื่อการแข่งขัน1.50$
, -2.00$
ฯลฯ และ[(){}[\]]
สำหรับตัวละครคลาสที่ตรงกับทุกชนิดของวงเล็บ / วงเล็บ / วงเล็บ
หากคุณต้องการที่จะเปลี่ยนสายป้อนผู้ใช้เป็น regex java.util.regex.Pattern.quote
ปลอดภัยรูปแบบการใช้งาน
อ่านเพิ่มเติม: RegexGuru บล็อกของ Jan Goyvaert เกี่ยวกับการหลีกเลี่ยงอักขระ
หนีอักขระพิเศษด้วยแบ็กสแลช \.
, \*
, \+
, \\d
และอื่น ๆ หากคุณไม่แน่ใจคุณสามารถหลีกเลี่ยงอักขระที่ไม่ใช่ตัวอักษรได้ไม่ว่าจะเป็นอักขระพิเศษหรือไม่ก็ตาม ดูที่ javadoc สำหรับ java.util.regex.Patternสำหรับข้อมูลเพิ่มเติม
นี่คือรหัสที่คุณสามารถคัดลอกวางได้โดยตรง:
String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
system.out.println(imageNameArray[i]);
}
และจะเกิดอะไรขึ้นถ้ามีช่องว่างเหลืออยู่ก่อนหรือหลัง "ผิด" ในกรณีดังกล่าว? เป็นแนวปฏิบัติที่ดีที่สุดในการพิจารณาช่องว่างเหล่านั้นด้วย
String imageName = "picture1 . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
for(int i =0; i< imageNameArray.length ; i++)
{
system.out.println(imageNameArray[i]);
}
ที่นี่ \\ s * อยู่ที่นั่นเพื่อพิจารณาช่องว่างและให้สตริงที่แยกเท่านั้น
ฉันต้องการจับคู่สตริงที่ลงท้ายด้วย ". *" สำหรับสิ่งนี้ฉันต้องใช้สิ่งต่อไปนี้:
"^.*\\.\\*$"
ค่อนข้างโง่ถ้าคุณคิดเกี่ยวกับมัน: D นี่มันหมายความว่าอะไร ที่จุดเริ่มต้นของสตริงสามารถมีอักขระใด ๆ เป็นศูนย์หรือมากกว่าครั้งตามด้วยจุด "." ตามด้วยดาว (*) ที่ท้ายสตริง
ฉันหวังว่านี่จะมีประโยชน์สำหรับใครบางคน ขอบคุณสำหรับแบ็กสแลชของ Fabian
"\\.\\*$"
แล้ว ไม่จำเป็นต้องตรงกันสำหรับการเริ่มต้นของสตริงถ้ามันไม่สำคัญกับคุณ
ถ้าคุณต้องการตรวจสอบว่าประโยคของคุณลงท้ายด้วย ". " แล้วคุณต้องเพิ่ม [\. \ ] $ ไปยังจุดสิ้นสุดของรูปแบบของคุณ
ฉันกำลังทำอาร์เรย์พื้นฐานบางอย่างใน JGrasp และพบว่าด้วยวิธีการเข้าถึงสำหรับอาร์เรย์ [] [] เพื่อใช้ ('.') เพื่อวางจุดเดียว