ค้นหาสตริงที่มีอักขระพิเศษโดยใช้ regex

ฉันต้องเลื่อนรายการและลบสตริงทั้งหมดที่มีอักขระพิเศษบางตัวออก การใช้ RegEx ฉันสามารถลบสตริงทั้งหมดที่ขึ้นต้นด้วยอักขระพิเศษเหล่านี้ได้ แต่ฉันจะทราบได้อย่างไรว่าอักขระพิเศษนี้อยู่ตรงกลางของสตริง

ตัวอย่างเช่น:

Pattern.matches("[()<>/;\\*%$].*", "(123)") 

คืนค่าจริงและฉันสามารถลบสตริงนี้ได้

แต่ใช้ไม่ได้กับสตริงประเภทนี้: 12(3)

ถูกต้องหรือไม่ที่จะใช้ \* เพื่อค้นหาอักขระ "*" ในสตริง

ขอบคุณสำหรับความช่วยเหลือ! แอนเดรีย


person Andrea Girardi    schedule 20.01.2012    source แหล่งที่มา


คำตอบ (3)


คุณยังเป็นเหยื่อของ .matches() ที่มีชื่อไม่ดีของ Java ซึ่งพยายามจับคู่อินพุต ทั้งหมด และขัดแย้งกับคำจำกัดความของการจับคู่ regex

สิ่งที่คุณต้องการคือการจับคู่อักขระหนึ่งตัวจาก ()<>/;\\*%$ ด้วย Java คุณต้องสร้าง Pattern, a Matcher จาก Pattern นี้ และใช้ .find() กับตัวจับคู่นี้:

final Pattern p = pattern.compile("[()<>/;\\*%$]");

final Matcher m = p.matcher(yourinput);

if (m.find()) // match, proceed
person fge    schedule 20.01.2012
comment
มันได้ผล :) !Pattern.compile([()‹›/;\*%$].*).matcher(res).find() - person Andrea Girardi; 20.01.2012
comment
ระวังคุณด้วย \* ที่นี่ มันจะตรงกับดวงดาวอย่างแท้จริง ถ้านี่คือสิ่งที่คุณต้องการ ก็ได้ หากคุณต้องการจับคู่ ทั้ง แบ็กสแลชและดาว คุณต้องจับคู่กับ "[()<>/;\\\\*%$]" - person fge; 20.01.2012

ลองดังต่อไปนี้:

!Pattern.matches("^[^()<>/;\\*%$]*$", "(123)")

สิ่งนี้ใช้คลาสอักขระที่ถูกปฏิเสธเพื่อให้แน่ใจว่าอักขระทั้งหมดในสตริงไม่ใช่อักขระใด ๆ ในคลาส

เห็นได้ชัดว่าคุณลบล้างนิพจน์เนื่องจากคุณกำลังทดสอบสตริงที่ไม่ตรงกัน

ถูกต้องหรือไม่ที่จะใช้ \* เพื่อค้นหาอักขระ "*" ในสตริง

ใช่.

person Rich O'Kelly    schedule 20.01.2012

Pattern.matches() พยายามจับคู่อินพุต ทั้งหมด ดังนั้นเนื่องจาก regex ของคุณบอกว่าอินพุตต้องขึ้นต้นด้วยอักขระ "พิเศษ" ดังนั้น 12(3) จึงไม่ตรงกัน

person Community    schedule 20.01.2012