Regular expressions

Jagaa
5 min readMay 26, 2022

--

Regex

this\s+is\s+text

this is text- this is text-тэй яг ижил байх ёстой.

\s - Нэг болон түүнээс дээш хоосон зай.

^\d+(\.\d+)? - “5”, “1.5”, “2.21”

^ - Шинэ мөрний эхлэл.

\d+ - Нэг болон түүнээс дээш тооны цифрүүд.

? - Optional буюу тухайн хэсэг байхгүй байсан ч болно.

\. - Цэг

() - Бүлэг

Түгээмэл ашиглагддаг тэмдэгтүүд

. - Ямар ч тэмдэгт байж болно.

^regex - Тухайн regex мөрийн эхэнд байрлана.

regex$ - Тухайн regex мөрийн төгсгөлд байрлана.

[abc] - a, b, c аль нэг байж болно.

[abc][vz] - a, b, c тэмдэгтүүдийн аль нэгний араас v, z-ийн аль нэг.

[^abc] - a, b, c-ээс өөр ямар нэгэн тэмдэгт.

[a-d1-7] - a, b,c, d, 1, 2, 3, 4, 5, 6, 7 аль нэг. Зөвхөн нэг тэмдэгт байна. d1 байж болохгүй.

X|Z - X эсвэл Z

XZ - XZ

$ - Мөрийн төгсгөл

Meta тэмдэгтүүд

\ - Тэмдэгтээс зайлсхийх. \w w үсэг биш дурын үсгэн тэмдэгт.

\d - Цифр буюу [0-9]

\D - Цифр биш [^0-9]

\s - Хоосон зай [ \t\n\x0b\r\f]

\S - Хоосон зайнаас өөр ямар нэгэн тэмдэгт.

\w - Үсэг [a-zA-Z_0-9]

\W - Үсэг биш

\S+ - Хоосон зайнаас өөр тэмдэгтүүд

\b - Matches a word boundary where a word character is [a-zA-Z0-9_]

Хэмжигч (Quantifier)

* - Тэг болон түүнээс дээш {0,}. X* X тэмтэгтүүд. .* дурын тэмдэгтүүд.

+ - Нэг болон түүнээс дээш {1,}. X+ нэг болон түүнээс дээш тооны X тэмдэгтүүдийг хайна.

? - Байхгүй эсвэл нэг удаа {0,1}. X? байхгүй эсвэл нэг X тэмдэгт.

{n} - n ширхэг тэмдэгт. \d{3} 3 ширхэг цифр. .{10} 10 ширхэг дурын тэмдэгт.

{n,m} - n-m ширхэг. \d{1,4} 1–4 ширхэг цифр.

*? - Reluctant quantifier. Хамгийн эхний тохиолдлыг олно.

Бүлэглэх

// Үсэг болон "." эсвэл ","-ын хоорон дахь хоосон зайг устгана.
String pattern = "(\\w)(\\s+)([\\.,])";
System.out.println(EXAMPLE_TEST.replaceAll(pattern, "$1$3"));
// Extract the text between the two title elements
pattern = "(?i)(<title.*?>)(.+?)()";
String updated = EXAMPLE_TEST.replaceAll(pattern, "$2");

Үгүйсгэх

a(?!b) - “a” тэмдэгтийг хайна. Гэхдээ “a” нь араасаа “b” тэмдэгтийг дагуулаагүй байх ёстой.

Specifying modes inside the regular expression

(?i) - Том жижиг үсэг хамаагүй.

{?s} - for “single-line mode” makes the dot match all characters, including line breaks.

(?m) for “multi-line mode” makes the caret and dollar match at the start and end of each line in the subject string.

String method

s.matches("regex") - regex-тай яг таарч байгаа эсэхийг шалгана. true, false.

s.split("regex") - split хийгээд array буцаана.

s.replaceFirst("regex"), "replacement" - хамгийн эхний тохиолдлыг солино.

s.replaceAll("regex"), "replacement” - бүх олдоцыг солино.

package de.vogella.regex.test;public class RegexTestStrings {
public static final String EXAMPLE_TEST = "This is my small example string which I'm going to use for pattern matching.";
public static void main(String[] args) {
System.out.println(EXAMPLE_TEST.matches("\\w.*"));
String[] splitString = (EXAMPLE_TEST.split("\\s+"));
System.out.println(splitString.length);// should be 14
for (String string : splitString) {
System.out.println(string);
}
// replace all whitespace with tabs
System.out.println(EXAMPLE_TEST.replaceAll("\\s+", "\t"));
}
}

Example:

package de.vogella.regex.string;public class StringMatcher {
// returns true if the string matches exactly "true"
public boolean isTrue(String s){
return s.matches("true");
}
// returns true if the string matches exactly "true" or "True"
public boolean isTrueVersion2(String s){
return s.matches("[tT]rue");
}
// returns true if the string matches exactly "true" or "True"
// or "yes" or "Yes"
public boolean isTrueOrYes(String s){
return s.matches("[tT]rue|[yY]es");
}
// returns true if the string contains exactly "true"
public boolean containsTrue(String s){
return s.matches(".*true.*");
}
// returns true if the string contains of three letters
public boolean isThreeLetters(String s){
return s.matches("[a-zA-Z]{3}");
// simpler from for
// return s.matches("[a-Z][a-Z][a-Z]");
}
// returns true if the string does not have a number at the beginning
public boolean isNoNumberAtBeginning(String s){
return s.matches("^[^\\d].*");
}
// returns true if the string contains a arbitrary number of characters except b
public boolean isIntersection(String s){
return s.matches("([\\w&&[^b]])*");
}
// returns true if the string contains a number less than 300
public boolean isLessThenThreeHundred(String s){
return s.matches("[^0-9]*[12]?[0-9]{1,2}[^0-9]*");
}
}

Pattern & Matcher

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTestPatternMatcher {
public static final String EXAMPLE_TEST = "This is my small example string which I'm going to use for pattern matching.";
public static void main(String[] args) {
Pattern pattern = Pattern.compile("\\w+");
// in case you would like to ignore case sensitivity,
// you could use this statement:
// Pattern pattern = Pattern.compile("\\s+", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(EXAMPLE_TEST);
// check all occurance
while (matcher.find()) {
System.out.print("Start index: " + matcher.start());
System.out.print(" End index: " + matcher.end() + " ");
System.out.println(matcher.group());
}
// now create a new pattern and matcher to replace whitespace with tabs
Pattern replace = Pattern.compile("\\s+");
Matcher matcher2 = replace.matcher(EXAMPLE_TEST);
System.out.println(matcher2.replaceAll("\t"));
}
}

Or

package de.vogella.regex.eitheror;import org.junit.Test;import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class EitherOrCheck {
@Test
public void testSimpleTrue() {
String s = "humbapumpa jim";
assertTrue(s.matches(".*(jim|joe).*"));
s = "humbapumpa jom";
assertFalse(s.matches(".*(jim|joe).*"));
s = "humbaPumpa joe";
assertTrue(s.matches(".*(jim|joe).*"));
s = "humbapumpa joe jim";
assertTrue(s.matches(".*(jim|joe).*"));
}
}

Утасны дугаар

public class CheckPhone {@Test
public void testSimpleTrue() {
String pattern = "\\d\\d\\d([,\\s])?\\d\\d\\d\\d";
String s= "1233323322";
assertFalse(s.matches(pattern));
s = "1233323";
assertTrue(s.matches(pattern));
s = "123 3323";
assertTrue(s.matches(pattern));
}
}

Давтагдсан үгнүүд

\b(\w+)\s+\1\b - \b нь үгийн хил, хязгаар. \1 references to the captured match of the first group, i.e., the first word.

(?!-in)\b(\w+) \1\b - Давтагдсан үгнүүд “-in”-ээр эхлээгүй.

Шинэ мөр

(\n\s*)title - “title” шинэ мөрнөөс хоосон зайгаар эхэлсэн байж болно.

Урт

package de.vogella.regex.numbermatch;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.junit.Test;import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class CheckNumber {@Test
public void testSimpleTrue() {
String s= "1233";
assertTrue(test(s));
s= "0";
assertFalse(test(s));
s = "29 Kasdkf 2300 Kdsdf";
assertTrue(test(s));
s = "99900234";
assertTrue(test(s));
}
public static boolean test (String s){
Pattern pattern = Pattern.compile("\\d{3}");
Matcher matcher = pattern.matcher(s);
if (matcher.find()){
return true;
}
return false;
}
}

Link

package de.vogella.regex.weblinks;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class LinkGetter {
private Pattern htmltag;
private Pattern link;
public LinkGetter() {
htmltag = Pattern.compile("<a\\b[^>]*href=\"[^>]*>(.*?)</a>");
link = Pattern.compile("href=\"[^>]*\">");
}
public List<String> getLinks(String url) {
List<String> links = new ArrayList<String>();
try {
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(new URL(url).openStream()));
String s;
StringBuilder builder = new StringBuilder();
while ((s = bufferedReader.readLine()) != null) {
builder.append(s);
}
Matcher tagmatch = htmltag.matcher(builder.toString());
while (tagmatch.find()) {
Matcher matcher = link.matcher(tagmatch.group());
matcher.find();
String link = matcher.group().replaceFirst("href=\"", "")
.replaceFirst("\">", "")
.replaceFirst("\"[\\s]?target=\"[a-zA-Z_0-9]*", "");
if (valid(link)) {
links.add(makeAbsolute(url, link));
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return links;
}
private boolean valid(String s) {
if (s.matches("javascript:.*|mailto:.*")) {
return false;
}
return true;
}
private String makeAbsolute(String url, String link) {
if (link.matches("http://.*")) {
return link;
}
if (link.matches("/.*") && url.matches(".*$[^/]")) {
return url + "/" + link;
}
if (link.matches("[^/].*") && url.matches(".*[^/]")) {
return url + "/" + link;
}
if (link.matches("/.*") && url.matches(".*[/]")) {
return url + link;
}
if (link.matches("/.*") && url.matches(".*[^/]")) {
return url + link;
}
throw new RuntimeException("Cannot make the link absolute. Url: " + url
+ " Link " + link);
}
}

References:

--

--