Regular expression нь string буюу текстээс тодорхой бүтэц бүхий хэсгийг хайж олох зорилготой загвар (pattern) юм. Regular expression-г regex гэж товчилдог. Бүх программчлалын хэл дээр regex-тэй ажилладаг класс, функцүүд байдаг ба тухайн хэлний онцлогоос хамаарч класс, функц нь элдэв янзаар бичигддэг боловч regex нь яг адилхан, нэг стандартын дагуу бичигдэнэ. Өдөр тутмын амьдралд түгээмэл тохиолддог зарим асуудал(бодлого)-ыг жава дээр regex ашиглаж хэрхэн хялбар шийдэж болохыг жишээгээр тайлбарлая.
Жава дээр Pattern, Matcher класуудын тусламжтайгаар хэрэгжүүлнэ.
1. Регистрийн дугаар шалгах (Эхний хоёр орон кирил том үсэг, араас нь 8 оронтой тоо)
Тэмдэгтүүдийн олонлогийг [ ] (дөрвөлжин хаалт) дотор бичнэ. [a-z]=a, b, c, ..., z
Цифрийг \d-ээр дүрсэлнэ. 0, 1, 2, ..., 9
Хэдэн оронтой вэ гэдийг { } (угалзан хаалт) дотор бичнэ. {8}: 8 оронтой. {1,3}: 1-3 буюу 1, 2, 3 оронтой. {2,}: 2 буюу түүнээс их оронтой.
|: Эсвэл тэмдэгт. a|b: a эсвэл b. [А-Я|Ө|Ү]: А-Я хүртэлх бүх тэмдэгт. Ө, Ү-н unicode нь A-Я завсарт оршдоггүй болохоор тусгайлан нэмж өгч байгаа юм.
2. Текстийг агуулагдсан тоонуудаар дэд хэсгүүдэд хуваах.
3. Текстийн эхэнд орсон 0-н цифрүүдийг хасах.
*: 0 буюу түүнээс олон ширхэг
4. Текстийн төгсгөлд орсон латин цагаан толгойн үсэг болон хоосон зайнуудыг хасах.
\s: Хоосон зайнууд (space, enter, \n, \r, \t)
+: Нэг болон нэгээс их ширхэг. \s*: Дараалсан бүх хоосон зай
(?i): Том, жижиг үсэг ялгахгүй (incasesensitive)
5. Dell, Acer-н нөүтбүүкний нэр бренд + үйлдвэрлэсэн он + модель гэсэн бүтэцтэй байг. Бренд, он, моделийг нь ялгаж хэвлэе.
6. Регитрийн дугаарын 2-6 оронгийн цифрүүдийг *-оор сольж, нууцалъя.
Regex-н хэрэглээ кодчилол гэлтгүй эгэл жирийн амьдралд ч багагүй тохиолддог. Ямар нэгэн бүтэцтэй жуман текстээс өөр төрлийн бүтэцтэй текст гаргаж авахад ихэнх тохиолдолд notepad++, sublime мэтийн текст едиторууд дээр regex ашиглаж амархан шийдчихэж болдог бөгөөд тэгж эс чадваас хэдэн минутын ажлыг хэдэн өдөр нухаж суух нигууртай ажгуу.
Жава дээр Pattern, Matcher класуудын тусламжтайгаар хэрэгжүүлнэ.
1. Регистрийн дугаар шалгах (Эхний хоёр орон кирил том үсэг, араас нь 8 оронтой тоо)
Pattern ptrn = Pattern.compile("([А-Я|Ө|Ү]{2})(\\d{8})");
Matcher matcher1 = ptrn.matcher("БИ88042515");
Matcher matcher2 = ptrn.matcher("AB88042515");
System.out.println(String.format("1: %s; 2: %s", matcher1.matches(), matcher2.matches()));
Хариу: 1: true; 2: false
Pattern классын объектыг Pattern классын compile статик методоор, харин Matcher классын объектыг Pattern объектын matcher методын тусламжтайгаар үүсгэнэ. matches метод нь текстэн утга regex-т тохирч буй эсэхийг шалгаж, тохирвол true, үгүй бол false буцаана.Тэмдэгтүүдийн олонлогийг [ ] (дөрвөлжин хаалт) дотор бичнэ. [a-z]=a, b, c, ..., z
Цифрийг \d-ээр дүрсэлнэ. 0, 1, 2, ..., 9
Хэдэн оронтой вэ гэдийг { } (угалзан хаалт) дотор бичнэ. {8}: 8 оронтой. {1,3}: 1-3 буюу 1, 2, 3 оронтой. {2,}: 2 буюу түүнээс их оронтой.
|: Эсвэл тэмдэгт. a|b: a эсвэл b. [А-Я|Ө|Ү]: А-Я хүртэлх бүх тэмдэгт. Ө, Ү-н unicode нь A-Я завсарт оршдоггүй болохоор тусгайлан нэмж өгч байгаа юм.
2. Текстийг агуулагдсан тоонуудаар дэд хэсгүүдэд хуваах.
String text = "Өнөөдөр 2018 оны 1-р сарын 13-ы өдөр. Гадаа -30 байна. Цаг 23:26.";
String[] parts = text.split("\\d{1,}");
for (String part : parts)
System.out.print(part
Хариу:
Өнөөдөр оны -р сарын -ы өдөр. Гадаа - байна. Цаг : .
3. Текстийн эхэнд орсон 0-н цифрүүдийг хасах.
String text = "000236435";
text = text.replaceAll("^0*", "");
System.out.println(text);
Хариу:
236435
^: Эхэлсэн гэдгийг илэрхийлнэ.*: 0 буюу түүнээс олон ширхэг
4. Текстийн төгсгөлд орсон латин цагаан толгойн үсэг болон хоосон зайнуудыг хасах.
String text = "236435Adgag a dgag \n";
text = text.replaceAll("((?i)[a-z|\\s*]+$)", "");
System.out.println(text);
Хариу:
236435
$: Төгссөн\s: Хоосон зайнууд (space, enter, \n, \r, \t)
+: Нэг болон нэгээс их ширхэг. \s*: Дараалсан бүх хоосон зай
(?i): Том, жижиг үсэг ялгахгүй (incasesensitive)
5. Dell, Acer-н нөүтбүүкний нэр бренд + үйлдвэрлэсэн он + модель гэсэн бүтэцтэй байг. Бренд, он, моделийг нь ялгаж хэвлэе.
String laptop1 = "Dell2017Inpiron15R";
String laptop2 = "Acer2016Aspire3760";
Pattern ptrn = Pattern.compile("(Dell|Acer)(\\d{4})(.+)");
Matcher matcher = ptrn.matcher(laptop1);
if (matcher.matches()) {
System.out.println(String.format("Brand: %s, Year: %s, Model: %s", matcher.group(1), matcher.group(2),
matcher.group(3)));
}
matcher = ptrn.matcher(laptop2);
if (matcher.matches()) {
System.out.println(String.format("Brand: %s, Year: %s, Model: %s", matcher.group(1), matcher.group(2),
matcher.group(3)));
}
Хариу:
Brand: Dell, Year: 2017, Model: Inpiron15R
Brand: Acer, Year: 2016, Model: Aspire3760
group: Regex-н дэд хэсгүүдэд харгалзах утга. ( )-аар хүрээлгэдсэн regex-н дэд хэсэг бүр нь 1 групп болно. 6. Регитрийн дугаарын 2-6 оронгийн цифрүүдийг *-оор сольж, нууцалъя.
String registerCode = "БИ88042515";
String maskedRegisterCode = registerCode.replaceAll("([А-Я|Ө|Ү]{2})(\\d{4})(\\d{4})", "$1****$3");
System.out.println(maskedRegisterCode);
Хариу:
БИ****2515
group-ээр replace хийхдээ $groupdIndex гэж бичнэ. Дээрх жишээний хувьд $1 = БИ, $2 = 8804, $3 = 2515 байна.Regex-н хэрэглээ кодчилол гэлтгүй эгэл жирийн амьдралд ч багагүй тохиолддог. Ямар нэгэн бүтэцтэй жуман текстээс өөр төрлийн бүтэцтэй текст гаргаж авахад ихэнх тохиолдолд notepad++, sublime мэтийн текст едиторууд дээр regex ашиглаж амархан шийдчихэж болдог бөгөөд тэгж эс чадваас хэдэн минутын ажлыг хэдэн өдөр нухаж суух нигууртай ажгуу.
Comments
Post a Comment