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: