[Java] - μλ° μ κ· ννμ(Regular Expression) + 2021 μΉ΄μΉ΄μ€ μ½ν (μ κ· μμ΄λ μΆμ²)
μλ νμΈμ~ μ΄μ μ μ΄μνλ λΈλ‘κ·Έ λ° GitHub, κ³΅λΆ λ΄μ©μ μ 리νλ Study-GitHub κ° μμ΅λλ€!
• π
β μ κ· ννμ(Regular Expression)
μλ νμΈμ, μ΄λ²μ μ 리ν λ΄μ©μ Javaμμμ μ κ· ννμ(Regular Expression) μ λλ€.
μ΅κ·Ό κ°λ°μ νλ©΄μ μ κ· ννμμ μ¬μ©νλ©΄ λ κ°λ¨νκ² ν΄κ²°ν μ μλ λ¬Έμ λ€μ κ½€ μμ£Ό μ νμκ³ ,
κ·Έλλ§λ€ μ£Όλ¨Ή ꡬꡬμμΌλ‘ μ νν μ΄ν΄μμ΄ κ²μμ ν΅ν΄ ν΄κ²°μ ν΄μμμ΅λλ€...
λ°λΌμ μ΄λ²μ μ 리λ₯Ό ν λ² νλ €κ³ ν©λλ€ β
μν€λ°±κ³Όμ λμμλ μ κ· ννμμ μ μλ λ€μκ³Ό κ°μ΅λλ€.
μ κ· ννμ(ζ£θ¦θ‘¨ηΎεΌ, μμ΄: regular expression, κ°λ¨ν regexp[1] λλ regex, rational expression)[2][3] λλ μ κ·μ(ζ£θ¦εΌ)μ νΉμ ν κ·μΉμ κ°μ§ λ¬Έμμ΄μ μ§ν©μ νννλ λ° μ¬μ©νλ νμ μΈμ΄μ΄λ€. μ κ· ννμμ λ§μ ν
μ€νΈ νΈμ§κΈ°μ νλ‘κ·Έλλ° μΈμ΄μμ λ¬Έμμ΄μ κ²μκ³Ό μΉνμ μν΄ μ§μνκ³ μμΌλ©°, νΉν νκ³Ό Tclμ μΈμ΄ μ체μ κ°λ ₯ν μ κ· ννμμ ꡬννκ³ μλ€. μ»΄ν¨ν° κ³Όνμ μ κ· μΈμ΄λ‘λΆν° μ λνμμΌλ ꡬν체μ λ°λΌμ μ κ· μΈμ΄λ³΄λ€ λ λμ μΈμ΄λ₯Ό ννν μ μλ κ²½μ°λ μμΌλ©°, μ¬μ§μ΄ μ κ· ννμ μ체μ λ¬Έλ²λ μ¬λ¬ κ°μ§ μ‘΄μ¬νκ³ μλ€. νμ¬ λ§μ νλ‘κ·Έλλ° μΈμ΄, ν μ€νΈ μ²λ¦¬ νλ‘κ·Έλ¨, κ³ κΈ ν μ€νΈ νΈμ§κΈ° λ±μ΄ μ κ· ννμ κΈ°λ₯μ μ 곡νλ€. μΌλΆλ ν, μλ°μ€ν¬λ¦½νΈ, 루λΉ, Tclμ²λΌ λ¬Έλ²μ λ΄μ₯λμ΄ μλ λ°λ©΄ λ·λ· μΈμ΄, μλ°, νμ΄μ¬, POSIX C, C++ (C++11 μ΄ν)μμλ νμ€ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄ μ 곡νλ€. κ·Έ λ°μ λλΆλΆμ μΈμ΄λ€μ λ³λμ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄ μ κ· ννμμ μ 곡νλ€. μ κ· ννμμ κ²μ μμ§, μλ νλ‘μΈμμ λ¬Έμ νΈμ§κΈ°μ μ°Ύμ λ°κΎΈκΈ° λνμμ, κ·Έλ¦¬κ³ sed, AWKμ κ°μ λ¬Έμ μ²λ¦¬ μ νΈλ¦¬ν°, μ΄ν λΆμμ μ¬μ©λλ€. ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D |
μμμ ν΅μ¬ λ¬Έμ₯μ λ€μκ³Ό κ°μ΅λλ€.
"νΉμ ν κ·μΉμ κ°μ§ λ¬Έμμ΄μ μ§ν©μ νννλ λ° μ¬μ©νλ νμ μΈμ΄"
μ κ· ννμμ λλΆλΆ λ¬Έμμ΄κ³Ό κ΄λ ¨λ λ¬Έμ ν΄κ²°μ μν΄ μ¬μ©ν©λλ€.
κ°μ₯ λ§μ΄ μ¬μ©νλ μμκ° μ΄λ©μΌ, νΈλν° λ²νΈ λ±μ μ ν¨μ± κ²μ¬λ₯Ό μν΄ μ¬μ©ν©λλ€.
μ κ· ννμμ λν΄ λ¬Έλ²κ³Ό μμ λ₯Ό ν΅ν΄ μ’ λ μμΈν μ΄ν΄λ³΄λλ‘ νκ² μ΅λλ€.
π μ κ· ννμ λ¬Έλ²
μ κ· ννμμ κΈ°νΈλ λ€μκ³Ό κ°μ΅λλ€.
β» 2021.08.09 \w, \W λ΄μ© μμ
\w μ κ²½μ° μνλ²³μ΄λ μ«μ, μΈλλ°(_) κΈ°νΈλ₯Ό μ°Ύμ΅λλ€.
\W μ κ²½μ° μνλ²³μ΄λ μ«μ, μΈλλ°(_)λ₯Ό μ μΈν λ¬Έμμ λλ€.
public class Tests {
public static void main(String[] args) {
String str = "a_b-c";
System.out.println(str.replaceAll("\\W", ""));
}
}
λ°λΌμ μΈλλ°λ μ μΈλ₯Ό ν΄μΌν κ²½μ°, λ€μκ³Ό κ°μ΄ μμ±μ ν΄μΌ ν©λλ€. π
String str = "a_b-c";
System.out.println(str.replaceAll("[\\W_]", ""));
// System.out.println(str.replaceAll("[a-zA-Z0-9]", "")); μμ λμΌν κ²°κ³Ό
μ κ· ννμμ λλΆλΆμ μμ λ΄μ©μ΄ μ λΆμΈλ°μ, μ λ΄μ©μ μ΄ν΄νλλΌλ μ€μ λ‘ μ¬μ©λλ μ κ·μμ μ΄ν΄λ³΄λ©΄
λ¬΄μ¨ μλ―Έλ₯Ό λ»νλμ§ μ΄ν΄νκΈ° νλ μ κ·μμ΄ λͺλͺ μ‘΄μ¬ν©λλ€... π€¦βοΈ
λ°λΌμ μ μ κ· ννμμμ λ λμκ° μ€μ μμ λ₯Ό ν΅ν΄ μ΄ν΄λ³΄κ² μ΅λλ€.
μ μ κ· ννμ κΈ°νΈμμ κΈ°μ΅ν΄μΌ ν μ μ, λ°±μ¬λ¬μ(\) κ° ν¬ν¨λμ΄ μλ κΈ°νΈλ€μ λλ€.
μ κ· ννμμμ λ°±μ¬λ¬μ(\)λ νμ₯ λ¬Έμλ‘, λ€μμ μΌλ° λ¬Έμκ° μ€λ©΄ νΉμλ¬Έμλ‘ μ·¨κΈνκ³ , λ°±μ¬λ¬μ λ€μμ νΉμλ¬Έμκ° μ€λ©΄ κ·Έ λ¬Έμ μ체λ₯Ό μλ―Έν©λλ€.
μλ₯Ό λ€μ΄, μνλ²³μ΄λ μ«μλ₯Ό λνλ΄λ \w κ°μ κ²½μ° Javaμμ \ μ체λ νΉμλ¬Έμλ‘ μ·¨κΈνκΈ° λλ¬Έμ, μνλ²³μ΄λ μ«μλ₯Ό νλ³νλ μ κ·μ κΈ°νΈλ λ€μκ³Ό κ°μ΄ μμ±μ ν΄μΌν©λλ€.
\\w // μνλ²³μ΄λ μ«μ
μ μ€λͺ λ§ λ³΄κ³ λ μ νν 무μμ μλ―Ένλμ§ μ΄ν΄νκΈ°κ° νλ€ μ μμΌλ―λ‘, μλμμ μ΄ν΄λ³Ό μμ λ₯Ό ν΅ν΄ μ΄ν΄νμλ©΄ λ κ² κ°μ΅λλ€ !!
μ κ· ννμ κ΄λ ¨ν΄μ λ무λ λ€μν κΈ°νΈλ€μ΄ μ‘΄μ¬νκΈ° λλ¬Έμ, μ λΆ λ€ μΈμ°λ κ²μ λΆκ°λ₯νκ³ ,
μ΄λ ν μν©μ μ΄λ ν κΈ°νΈκ° μ¬μ©λλμ§ μ΄ν΄νλ κ²μ΄ μ€μν κ² κ°μ΅λλ€.
κ°μΈμ μΌλ‘ μ£Όλ‘ μ¬μ©νλ κΈ°νΈλ€μ λ€μκ³Ό κ°μ΅λλ€.
[] () \w * + {} ^ $ ...
μμ£Ό μ¬μ©νλ ν¨ν΄μ μ κ· ννμμ λνλ΄λ³΄λ©΄ λ€μκ³Ό κ°μ΅λλ€.
μ κ· ννμ | μλ―Έ |
^[0-9]*$ == \\d | μ«μ |
^[a-zA-Z]*$ | μνλ²³ |
^[κ°-ν£]*$ | νκΈ |
^[a-zA-Z0-9] | μνλ²³μ΄λ μ«μ |
^[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-z]+$ | μ΄λ©μΌ(Email) |
\w+@\w+\.\w+(\\.\\w+)? | μ΄λ©μΌ(Email) |
^01(?:0|1|[6-9])-(?:\\d{3}|\\d{4})-\\d{4}$ | ν΄λν° λ²νΈ |
μμ κ°μ΄ μΌλ°μ μΌλ‘ μμ£Ό μ¬μ©λλ μ κ· ννμμ΄ μ‘΄μ¬νλλ°μ, μ²μ λ΄€μλ κ° ννμμ΄ λ¬΄μ¨ μλ―Έλ₯Ό λνλ΄λμ§ νμ νκΈ° νλ€ μ μμ΅λλ€.
μμ λ₯Ό ν΅ν΄ μ κ· ννμμ μ΅ν κ²μ μΆμ²λ립λλ€ !!
π μ κ· ννμ μμ
μμ μμ μ΄ν΄λ³Ό ν΄λμ€ λ° λ©μλλ λ€μκ³Ό κ°μ΅λλ€.
ν΄λμ€ λ° λ©μλμ λν μμΈν λ΄μ©μ 곡μ λ¬Έμλ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ !
docs.oracle.com/javase/8/docs/api/
Pattern ν΄λμ€
- μ κ· ννμμ λν λ¬Έμμ΄κΈ κ²μ¦νλ κΈ°λ₯
- 곡κ°λ μμ±μλ₯Ό μ 곡νμ§ μμ
- ν¨ν΄μ μμ±νλ €λ©΄ Pattern κ°μ²΄λ₯Ό λ°ννλ μ μ compile λ©μλλ₯Ό νΈμΆν΄μΌ ν¨
- matches() λ©μλλ₯Ό νμ©νμ¬ κ²μ¦
- regex: μ κ· ννμ
- input: κ²μ¦ν λ¬Έμμ΄
public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}
Matcher ν΄λμ€
- ν¨ν΄μ ν΄μνκ³ μ λ ₯ λ¬Έμμ΄μ λν΄ μΌμΉ μμ μ μννλ μμ§
- Pattern ν΄λμ€μ λμΌνκ² μ΄λ ν 곡κ°λ μμ±μλ μ μνκ³ μμ§ μμ
- Pattern κ°μ²΄μ matcher() λ©μλλ₯Ό νΈμΆν΄μ μ»μ
- matches() λ©μλλ₯Ό νμ©νμ¬ κ²μ¦
- regex: μ κ· ννμ
- input: κ²μ¦ν λ¬Έμμ΄
/**
* Creates a matcher that will match the given input against this pattern.
*
* @param input
* The character sequence to be matched
*
* @return A new matcher for this pattern
*/
public Matcher matcher(CharSequence input) {
if (!compiled) {
synchronized(this) {
if (!compiled)
compile();
}
}
Matcher m = new Matcher(this, input);
return m;
}
String.replaceAll()
- Javaμ λ¬Έμμ΄μμ μ κ·μμ μ¬μ©νλ λ©μλ μ€ νλμ λλ€.
- λ¬Έμμ΄ λ΄μ μλ μ κ·μ(regex)μ 맀μΉλλ λͺ¨λ λ¬Έμμ΄μ replacement λ¬Έμλ‘ μΉνν©λλ€.
public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}
μ λ String ν΄λμ€μ replaceAll() λ©μλλ₯Ό ν΅ν΄ μ κ· ννμμ΄ μ΄λ»κ² μ¬μ©λλμ§ μ΄ν΄λ³΄κ² μ΅λλ€ !!
Pattern ν΄λμ€ λ° Matcher ν΄λμ€μ λν μ¬μ©λ²μ μλ λΈλ‘κ·Έλ₯Ό μ°Έκ³ ν΄ μ£ΌμΈμ π
blog.naver.com/zzang9ha/222013925468
coding-factory.tistory.com/529
πString.replaceAll(String regex, String replacement)
μμ λ 2021 μΉ΄μΉ΄μ€ λΈλΌμΈλ μ±μ© μ½λ© ν μ€νΈμ λ¬Έμ μΈ μ κ· μμ΄λ μΆμ² μ λλ€.
μμ κ°μ΄ μμ΄λμ μ ν¨μ±μ κ²μ¬νλ μ¬λ¬ λ¨κ³κ° μ‘΄μ¬νλλ°μ,
κ° λ¨κ³λ₯Ό μ κ· ννμμ ν΅ν΄ μ²λ¦¬λ₯Ό νλ©΄ κ°λ¨νκ² ν΄κ²°ν μ μμ΅λλ€.
μ λ¬Έμ μμ μ κ· ννμμ ν΅ν΄ ν΄κ²°ν μ μλ λ¨κ³λ 2λ¨κ³, 3λ¨κ³, 4λ¨κ³, 6λ¨κ³ μ λ μΈ κ² κ°μ΅λλ€.
νλμ© μ΄ν΄λ΄ μλ€π
πΆ 2λ¨κ³ new_idμμ μνλ²³ μλ¬Έμ, μ«μ, λΉΌκΈ°(-), λ°μ€(_), λ§μΉ¨ν(.)λ₯Ό μ μΈν λͺ¨λ λ¬Έμλ₯Ό μ κ±°ν©λλ€.
μμμ ν΅μ¬ ν€μλλ μνλ²³ μλ¬Έμ, μ«μ, λΉΌκΈ°, λ°μ€, λ§μΉ¨ν μ λλ€.
μ κ· ννμμ μνλ²³ μλ¬Έμ(a-z), μ«μ(0-9 νΉμ \d), λΉΌκΈ°&λ°μ€&λ§μΉ¨ν(-_.) μ λλ€.
λ°λΌμ 2λ¨κ³λ₯Ό μ κ· ννμμ ν΅ν΄ λͺ¨λ λ¬Έμλ₯Ό μ κ±°νλ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
// String s
s = s.replaceAll("[^a-z\\d\\-_.]*", "");
- ^μ κ²½μ° λ¬Έμμ΄μ μμμ μλ―Ένμ§λ§, [] λ΄μ μ‘΄μ¬νλ©΄ not μ μλ―Έν©λλ€.
- μμμ μ€λͺ λλ Έλ―μ΄, λ°±μ¬λ¬μ(\)λ₯Ό λ λ² μ¨μ£Όμ΄μΌ μ μμ μΈ κ²μ¬κ° κ°λ₯ν©λλ€.
μ μ κ· ννμμ λ κ°λ¨νκ² μ€μ΄λ©΄ λ€μκ³Ό κ°μ΅λλ€.
s = s.replaceAll("[^\\w\\-_.]*", "");
- 2λ¨κ³μ μ ν¨μ± κ²μ¬μλ μΌμΉνμ§ μμ§λ§, λ¬Έμ μ 1λ¨κ³μμ μ΄λ―Έ λͺ¨λ λ¬Έμλ₯Ό μλ¬Έμλ‘ μΉννκΈ° λλ¬Έμ μμ κ°μ΄ \w(μνλ²³μ΄λ μ«μ)λ₯Ό μμ±ν΄μ£Όμ΄λ κ²°κ³Όλ λμΌν©λλ€.
- μ μ κ· ννμμ λ¬Έμμ΄μ λλ¬Έμκ° μ‘΄μ¬νλ©΄, λλ¬Έμλ μ κ±°ν΄μ£Όμ§ μμ΅λλ€.
πΆ 3λ¨κ³ new_idμμ λ§μΉ¨ν(.)κ° 2λ² μ΄μ μ°μλ λΆλΆμ νλμ λ§μΉ¨ν(.)λ‘ μΉνν©λλ€.
μμμ ν΅μ¬ ν€μλλ 2λ² μ΄μ μ°μλ λΆλΆμ λλ€.
μμ μ ν¨μ± κ²μ¬λ μ κ· ννμμ μ¬μ©νμ§ μκ³ κ°λ₯νκ² μ§λ§, μ½λκ° λ³΅μ‘νκ² λ κ±°λΌκ³ μκ°ν©λλ€...π€
λ°λΌμ μ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ νμ λλ λ²μλ₯Ό λνλ΄λ {} κΈ°νΈλ₯Ό μ¬μ©ν©λλ€.
// "[.]{2.}"
s = s.replaceAll("\\.{2,}", ".");
- μ£Όμ μ²λ¦¬λ μ κ· ννμκ³Ό replaceAllμ μμ±λ μ κ· ννμμ λμΌν μλ―Έμ λλ€.
- \\. (λ§μΉ¨ν)
- {2,} 2ν μ΄μ
πΆ 4λ¨κ³ new_idμμ λ§μΉ¨ν(.)κ° μ²μμ΄λ λμ μμΉνλ€λ©΄ μ κ±°ν©λλ€.
μμμ λ§μΉ¨ν(.)κ° μ²μμ΄λ λμ μμΉνλ€λ©΄ μ κ±°λ₯Ό ν΄μΌνλλ°μ, λ§μ½ μ κ· ννμμ μ¬μ©νμ§ μλλ€λ©΄ ..
첫 λ¬Έμμ λ§μ§λ§ λ¬Έμκ° λ§μΉ¨ν(.) μΈμ§ μ¬λΆλ₯Ό νλ¨ν΄μ μ κ±°ν΄μΌ ν©λλ€.
νμ§λ§, μ κ· ννμμ ν΅ν΄ κ°λ¨ν ν΄κ²°μ΄ κ°λ₯ν©λλ€.
s = s.replaceAll("^[.]|[.]$", "");
- ^ λ λ¬Έμμ μμμ μλ―Έν©λλ€.
- [.] λ . μ μλ―Ένκ³ , μ¦ ^[.] λ λ¬Έμμ΄μ΄ λ§μΉ¨ν(.)λ‘ μμνλ κ²μ μλ―Έν©λλ€.
- | λ ν¨ν΄ μμμ or μ°μ°(μ²μμ΄λ λμ μμΉνλ κ²½μ°)μ μλ―Έν©λλ€.
- [.]$ λ λ¬Έμμ΄μ λμ΄ λ§μΉ¨ν(.)λ‘ λλλ κ²μ μλ―Έν©λλ€.
2022.02.07 μΆκ°
- μ μ κ· ννμμ λκ΄νΈλ₯Ό μλ΅νκ³ λ€μκ³Ό κ°μ΄ λνλΌ μ μμ΅λλ€.
s = s.replaceAll("^.|.$", "");
πΆ 6λ¨κ³ new_idμ κΈΈμ΄κ° 16μ μ΄μμ΄λ©΄, new_idμ 첫 15κ°μ λ¬Έμλ₯Ό μ μΈν λλ¨Έμ§ λ¬Έμλ€μ λͺ¨λ μ κ±°ν©λλ€. λ§μ½ μ κ±° ν λ§μΉ¨ν(.)κ° new_idμ λμ μμΉνλ€λ©΄ λμ μμΉν λ§μΉ¨ν(.) λ¬Έμλ₯Ό μ κ±°ν©λλ€.
μμμ λ§μΉ¨ν(.)κ° λμ μμΉνλ κ²½μ°λ 4λ¨κ³μμ μμ±μ ν΄λ³΄μμ΅λλ€.
λ°λΌμ 6λ¨κ³μ μ 체 κ²μ¬λ₯Ό λνλ΄λ μ½λλ λ€μκ³Ό κ°μ΅λλ€.
private KakaoId notGraterThan16() {
if (s.length() >= 16) {
s = s.substring(0, 15);
}
s = s.replaceAll("[.]$", "");
return this;
}
μ΄μμΌλ‘ μλ° μ κ· ννμμ λν΄ μ΄ν΄λ³΄μμ΅λλ€!
μ κ· ννμμ μ λ§ μμ£Ό μ¬μ©νλ κ²μ μλμ§λ§, μμλλ©΄ κΌ μ¬μ©ν΄μΌ ν λκ° μλ κ² κ°μ΅λλ€.
λ°λΌμ μ κ· ννμμ λν΄ μ΄λμ λ μ΄ν΄νκ³ , μ¨λ¨Ήμ μ μμ μ λλ‘λ 곡λΆλ₯Ό νλ κ²μ΄ μ’μ κ² κ°μ΅λλ€.