ตัด String ด้วย Regular expression ในจาวา

เล่าเรื่องงานอีกหละ ฮะๆๆ วันนี้มีสิ่งที่ต้องทำอยู่หนึ่งอย่าง(หลังจากอัดทำไปในสองวันแรก วันหลังๆ เลยรู้สึกน้อยเลย -_-”) คือหาทางกรองข้อมูล คราวนี้ข้อมูลที่มามันเป็นอย่างนี้

xxxhello55xxxx garbage garbage xxxx
xworld6xxx garbage garbage xxxx
xxxxxxbaa7777xxxx garbage garbage xxxx

แล้วสิ่งที่ต้องการคือคำที่อยู่ระหว่าง x ช่องแรกสุด (hello, world, baa) วิธีการง่ายๆ ถ้าไม่ใช้ expression ก็คือหาทางตัดเอา x ด้านหน้ากับ x ด้านหลังและข้อความที่เหลือทิ้งไปให้หมด แต่มันช่างเปลืองแรงยังไงไม่รู้ทั้งๆ ที่จาวามันก็มี expression ที่สามารถตัดเอาคำที่ตรงตามรูปแบบที่ต้องการมาให้เลยได้อยู่แล้ว ทำไมเราต้องไปหาทางตัดมันเองด้วย ก็เลยลองขุดๆ ดูแล้วก็พบวิธีทำตามด้านล่าง

73
74
75
76
77
for (String data:datas) {
 Matcher m = Pattern.compile("[a-z]+\\d+").matcher(data);
 m.find();
 System.out.println(m.group());
}

เห้ย อะไรมันจะยุ่งยากงี้ฟะ ทำไมมันต้องทำหลายขั้นตอนงี้ด้วย ต้องการแค่หารูปแบบที่ต้องการใน String เท่านั้นเอง ทำไมมันไม่มีอะไรง่ายๆ แบบบรรทัดเดียวจบบ้างฟะเช่น

String[] outputs = datas.find("[a-z]+\\d+");

เห้อ ลองส่งไปใน Twitter ก็ได้คำแนะนำจาก @sugree มาว่าใช้ python เถอะ รู้สึกเห็นด้วยเลย T T” แต่ว่าส่วนนี้เป็นงานที่ทำและแก้ไขกันมาอย่างยาวนานแล้ว ถ้าจะให้เปลี่ยนเป็น python อาจจะกระอักเลือดได้ เพราะงั้นใช้ต่อไป แล้วงานส่วนตัวใช้ภาษาอื่นที่ไม่ใช่จาวาดีกว่า ท่าทางจะประหยัดแรงเป็นที่สุด
ปอลอ. หลายคนอาจจะสงสัยว่าทำไม expression ที่ใช้ไม่ทำเป็น \\w+ ไปเลย เหตุผลจริงๆ แล้วมาจากข้อมูลที่รูปแบบของ expression จริงๆ มันเป็น [a-z]{2,3}\\w+ หนะ คือเป็นตัวอักษรด้านหน้า 2-3 ตัวแล้วค่อยตามด้วยตัวเลข ไม่ไช่ เป็นตัวอักษรและตัวเลขสลับกันเหมือน \\w+ เลย
ปอลอสอง. เอาของ python มาเทียบ

re.search('[a-z]{2,3}\d+', data)


Comments

No comments yet.

Add Yours

  • Author Avatar

    YOU


Comment Arrow



About Author

llun

Apple addict programmer