0. νμ΅ λͺ©μ
- μ κ· ννμμ νμ©ν μ μλ Java ν΄λμ€λ€μλ 무μμ΄ μλμ§ νμ νλ€.
- ν΄λΉ ν΄λμ€λ€μ λ§€μλμ λ»κ³Ό μ¬μ©λ²μ μ΅νλ€.
1. μ κ· ννμμ νμ©ν μ μλ Java ν΄λμ€
java.util.regex
μ μλPattern
ν΄λμ€μMatcher
ν΄λμ€ νμ©String
ν΄λμ€μ μ κ· ννμ μ¬μ© κ°λ₯ λ§€μλ νμ©
2. Pattern
κ³Ό Matcher
μ΄ν΄νκΈ°
(1) Pattern
ν΄λμ€
μ κ· ννμμ μ»΄νμΌνμ¬ κ°μ§κ³ μλ ν΄λμ€
- λΆλ³ κ°μ²΄ (ν λ² μ κ· ννμ μ λ ₯ν΄μ μ»΄νμΌνλ©΄, μ΄ν λμΌ Pattern κ°μ²΄μ μ κ· ννμμ λ°κΏ μ μλ€.)
- Thread-Safe -> μ¬λ¬ μ€λ λμμ κ°μ Pattern κ°μ²΄ 곡μ κ°λ₯
Pattern ν΄λμ€λ μ κ· ννμμ λ΄κ³ μλ μν λ°μ νμ§ μλλ€. λ¬Έμμ΄ λ΄μμ μ κ· ννμ κ²μ, μΆμΆ, μΉνμ ν΄λΉ Pattern ν΄λμ€λ₯Ό νμ©νλ Matcher
ν΄λμ€ κ°μ²΄κ° λμ νλ€. νλμ Pattern κ°μ²΄λ μ¬λ¬ Matcher κ°μ²΄μ μν΄ κ³΅μ λμ΄ μ¬μ©λμ΄μ§ μ μλ€.
(2) Matcher
ν΄λμ€
Pattern κ°μ²΄λ₯Ό νμ©νμ¬ InputμΌλ‘ λ€μ΄μ€λ λ¬Έμμ΄μ λν΄ λ΄λΆ ν¨ν΄ κ²μ
, μΆμΆ
, μΉν
λ±μ μ§ννλ€.
- Matcher κ°μ²΄κ° μμ±λ λ, κΈ°μ€μ΄ λλ patternμ μΆνμ λ€λ₯Έ patternμΌλ‘ κ΅μ²΄ν μ μλ€.
- Thread-Safe νμ§ μλ€.
(3) κ°μ²΄ λ§λ€μ΄μ νμ©
// 1. Pattern μμ± - μΈμλ‘ λ£μ μ κ·ννμμ λ΄λΆμ κ°μ§κ³ μλλ€.
// Patternμ λΆλ³ κ°μ²΄μμΌλ‘ μ΄λ₯Ό μΆνμ λ°κΏ μ μλ€.
Pattern pattern = Pattern.compile("\\d{3}-\\d{4}-\\d{4}");
// 2. Matcher μμ± - Patternκ³Ό μ
λ ₯ λ¬Έμμ΄ κ²°ν©
// μ΄μ ν΄λΉ matcherμ λ§€μλλ€μ μ
λ ₯μΌλ‘ λ°μ λ¬Έμμ΄μ λν κ²μ, μΆμΆ, μΉν μμ
λ§ μ§ννλ€.
// input λ¬Έμμ΄μ .reset()μΌλ‘ λ°κΏ μ μμΌλ, matcherκ° λ΄λΆμ κ°μ§ pattern κ°μ²΄ μ체λ λ°κΏ μ μλ€.
Matcher matcher = pattern.matcher("010-1234-5678");
// 3. λ§€μΉ μν
// find()λ λ¬Έμμ΄μ λΆλΆμ΄ patternμ μΌμΉνλ©΄ true, μλλ©΄ falseλ₯Ό λ°ννλ€.
boolean found = matcher.find();
(4) Pattern
ν΄λμ€μ μ μ λ§€μλμ λ©€λ² λ©μλ
λ©μλ | λ°ν νμ | μ€λͺ |
---|---|---|
Pattern.compile(String regex) |
Pattern | μ κ·ννμμ μ»΄νμΌνμ¬ Pattern κ°μ²΄ μμ± |
Pattern.matches(String regex, String input) |
boolean | μ 체 λ¬Έμμ΄μ΄ ν¨ν΄κ³Ό μΌμΉνλμ§ νμΈ |
pattern.matcher(CharSequence input) |
Matcher | μ λ ₯ λ¬Έμμ΄κ³Όμ ν¨ν΄ λ§€μΉμ μν Matcher κ°μ²΄ μμ± |
pattern.split(CharSequence input) |
String[] | ν¨ν΄μ ꡬλΆμλ‘ λ¬Έμμ΄ λΆν |
pattern.pattern() | String | μ»΄νμΌλ μ κ·ννμ λ°ν |
1,2λ²μ μ μ λ§€μλμ΄λ€. νΉν 2λ²μ μ κ· ννμκ³Ό λ¬Έμμ΄μ λ± ν λ²λ§ νμΈν λ μ¬μ©νλ€. νμ§λ§ μ¬νμ©ν μκ° μλ€.
(5) Matcher
ν΄λμ€μ μ μ λ§€μλμ λ©€λ² λ§€μλ
matcher.find() |
boolean | λ¬Έμμ΄ λ΄μμ μ»΄νμΌλ μ κ·ννμκ³Ό λμλλ λΆλΆμ μ°Ύμ -> iteratorλ₯Ό μ°λ κ²μ²λΌ, find() νΈμΆλ νμλ κ·Έ μ΄ν λ¬Έμμ΄ μ€ ν¨ν΄κ³Ό μΌμΉνλ κ²μ΄ μλμ§ μ¬λΆλ₯Ό λ€μ νμΈν¨. |
matcher.matches() |
boolean | μ 체 λ¬Έμμ΄μ΄ ν¨ν΄κ³Ό μΌμΉνλμ§ νμΈ |
matcher.group() |
String | ν¨ν΄κ³Ό λ§€μΉλ μ 체 λ¬Έμμ΄ λ°ν μ¬λ¬ κ°λΌλ©΄ matcher.group() ν λλ§λ€ κ·Έ λ€μ κ²μ΄ λμ¨λ€. |
matcher.group(int) |
String | n λ²μ§Έ μΊ‘μ³κ·Έλ£Ή λ°ν |
matcher.start() |
int | λ§€μΉλ λΆλΆμ μμ μΈλ±μ€ |
matcher.end() |
int | λ§€μΉλ λΆλΆμ λ μΈλ±μ€ |
matcher.replaceAll(String replacement) |
String | λͺ¨λ λ§€μΉ λΆλΆμ replacementλ‘ κ΅μ²΄ |
A. find() μ matches() μ ν΅μ¬ μ°¨μ΄μ
find()
: λ¬Έμμ΄ λ΄μμ ν¨ν΄μ΄ μ΄λλ μμΌλ©΄ true λ°νmatches()
: μ 체 λ¬Έμμ΄μ΄ ν¨ν΄κ³Ό μ νν μΌμΉν΄μΌ true λ°ν
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("abc123def");
System.out.println(matcher.find()); // true - "123" λ°κ²¬
System.out.println(matcher.matches()); // false - μ μ²΄κ° μ«μκ° μλ
// μ μ²΄κ° μ«μμΈ κ²½μ°
Matcher matcher2 = pattern.matcher("12345");
System.out.println(matcher2.matches()); // true - μ μ²΄κ° μ«μ
B. group μΆμΆ λ§€μλ
// λ‘κ·Έμμ μκ°κ³Ό λ 벨 μΆμΆ
public void parseLogEntry(String logLine) {
Pattern pattern = Pattern.compile("(\\d{2}:\\d{2}:\\d{2})\\s+(\\w+)\\s+(.+)");
Matcher matcher = pattern.matcher("14:30:15 ERROR Database connection failed");
if (matcher.find()) {
String time = matcher.group(1); // "14:30:15"
String level = matcher.group(2); // "ERROR"
String message = matcher.group(3); // "Database connection failed"
System.out.printf("Time: %s, Level: %s, Message: %s%n",
time, level, message);
}
}
// λ¬Έμμ΄μμ λͺ¨λ μ«μ μΆμΆ
public List<Integer> extractNumbers(String text) {
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher("Price: 1500, Quantity: 3, Total: 4500");
List<Integer> numbers = new ArrayList<>();
while (matcher.find()) {
numbers.add(Integer.parseInt(matcher.group()));
}
return numbers; // [1500, 3, 4500]
}
3. String
ν΄λμ€ λ΄μ μ κ· ννμ λ§€μλ
λ©μλ | λ°ν νμ | μ€λͺ |
---|---|---|
str.matches(String regex) |
boolean | λ¬Έμμ΄μ΄ ν¨ν΄κ³Ό μμ ν μΌμΉνλμ§ νμΈ |
str.split(String regex) |
String[] | μ κ·ννμμ ꡬλΆμλ‘ λ¬Έμμ΄ λΆν |
str.replaceAll(String regex, String replacement) |
String | ν¨ν΄κ³Ό λ§€μΉλλ λͺ¨λ λΆλΆμ κ΅μ²΄ -> μ κ·μ νμ© μΉν κ°λ₯ |
str.replaceFirst(String regex, String replacement) |
String | ν¨ν΄κ³Ό μ²μ λ§€μΉλλ λΆλΆλ§ κ΅μ²΄ |
A. ν¨ν΄μ μΌμΉνλ λΆλΆ λ¬Έμμ΄μ μΌλ° λ¬Έμμ΄λ‘ μΉν
// λͺ¨λ μ«μλ₯Ό λ³νλ‘ μΉν
public String maskNumbers(String text) {
return text.replaceAll("\\d+", "***");
}
// "Phone: 010-1234-5678" β "Phone: ***-***-***"
// 첫 λ²μ§Έ λ§€μΉλ§ μΉν - replaceFirst()
public String maskFirstNumber(String text) {
return text.replaceFirst("\\d+", "***");
}
// "Phone: 010-1234-5678" β "Phone: ***-1234-5678"
B. ν¨ν΄μ μΌμΉνλ λΆλΆμ μ κ·ννμμΌλ‘ λ³ν
// 1. ν¨ν΄ κ·Έλ£Ήμ μμ λ°κΎΈκΈ°
// λ μ§ νμ λ³ν (yyyy-mm-dd β dd/mm/yyyy)
public String convertDateFormat(String date) {
return date.replaceAll("(\\d{4})-(\\d{2})-(\\d{2})", "$3/$2/$1");
}
// "2023-12-25" β "25/12/2023"
// 2. μ κ· ννμμ μμ λ°κΎΈκΈ°
// μ΄λ¦ μμ λ°κΎΈκΈ° (μ±, μ΄λ¦ β μ΄λ¦ μ±)
public String swapName(String fullName) {
return fullName.replaceAll("([A-Za-z]+),\\s*([A-Za-z]+)", "$2 $1");
}
// "Smith, John" β "John Smith"
ν΅μ¬ μμ½
- Javaμμ μ κ· ννμμ μ°λ €λ©΄
Pattern
,Matcher
,String
ν΄λμ€λ₯Ό νμ©ν΄μΌ νλ€. Pattern
μ Thread-safe λΆλ³ κ°μ²΄λ‘ λ΄λΆμ μ κ· ννμ ν¨ν΄μ μ μ₯νλ€. μ¬λ¬ Matcherμ μν΄ κ³΅μ λ μ μλ€.Matcher
λ νλμ Patternμ λ©€λ²λ‘ κ°μ§λ©°, ν΄λΉ Patternμ μμ± μμ μ μ ν΄μ§ λ€, κ΅μ²΄ν μ μλ€.- μΆμΆμ Matcher, μΉνμ String ν΄λμ€ μ¨μΌνλ€.
λΆλ‘
A. λͺ¨λ₯΄λ λ¨μ΄ μ 리
B. μ°Έκ³ λ¬Έμ
C. κ΄λ ¨ κΈ
TABLE without id file.inlinks AS "BackLink"
WHERE file.path = this.file.path