ตัด 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)
- Immutable pattern and string
- HashSet ใน Java
- Regular expression กับภาษาไทย
- replaceAll กับ “\”
- Flex RegExpValidator




Add Yours
YOU