从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础工具,可以用于很多类型的文本处理, 如匹配,搜索,提取和分析结构化内容.
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher.
Pattern是一个正则表达式经编译后的表现模式。 在java中,通过适当命名的Pattern类可以容易确定String是否匹配某种模式.模式可以象匹配某个特定的String那样简单,也可以很复 杂,需要采用分组和字符类,如空白,数字,字母或控制符.因为Java字符串基于统一字符编码(Unicode),正则表达式也适用于国际化的应用程序.
Pattern类的方法简述
方法 |
说明 |
static Pettern compile(String regex,int flag) |
编译模式,参数regex表示输入的正则表达式,flag表示模式类型(Pattern.CASE_INSENSITIVE 表示不区分大小写)
|
Matcher match(CharSequence input) |
获取匹配器,input时输入的待处理的字符串
|
static boolean matches(String regex, CharSequence input) |
快速的匹配调用,直接根据输入的模式regex匹配input
|
String[] split(CharSequence input,int limit) |
分隔字符串input,limit参数可以限制分隔的次数
|
Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。首先一个Pattern实例订制了一个所用语法与 PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。
Matcher类的方法简述
方法 |
说明 |
boolean matches() |
对整个输入字符串进行模式匹配.
|
boolean lookingAt() |
从输入字符串的开始处进行模式匹配 |
boolean find(int start) |
从start处开始匹配模式
|
int groupCount() |
返回匹配后的分组数目 |
String replaceAll(String replacement) |
用给定的replacement全部替代匹配的部分
|
String repalceFirst(String replacement) |
用给定的replacement替代第一次匹配的部分
|
Matcher appendReplacement(StringBuffer sb,String replacement) |
根据模式用replacement替换相应内容,并将匹配的结果添加到sb当前位置之后
|
StringBuffer appendTail(StringBuffer sb) |
将输入序列中匹配之后的末尾字串添加到sb当前位置之后.
|
정규식의 일반적인 와일드카드:
단일 문자열 비교의 경우 정규식을 사용해도 이점이 없습니다. Regex의 진정한 장점은 문자 클래스와 한정자( *, ,? ) 더 복잡한 패턴의
문자 클래스에는 다음이 포함됩니다.
d 숫자
D 숫자가 아닌 문자
w 한 단어 문자(0-9,A-Z,a-z)
W 한 단어가 아닌 문자
공백(공백 문자, 줄 바꿈, 캐리지 리턴, 탭)
S 공백이 아닌
[] 대괄호
안의 문자 목록에서 생성된 사용자 정의 문자 클래스
아래의 단일 문자와 일치합니다. 문자는 일치하는 수에 하위 패턴을 적용하는 프로세스를 제어하는 데 사용됩니다.
? 이전 하위 패턴을 0번에서 한 번 반복합니다.
* 이전 하위 패턴을 0번 이상 반복합니다.
이전 하위 패턴을 반복합니다. 일대다수
다음은 예시 부분입니다.
예 1: 정규식 가장 간단한 패턴은 지정된 문자열과 정확하게 일치할 수 있습니다. 패턴은 일치할 텍스트와 동일합니다. 정적 Pattern.matches 메서드는 문자열이 지정된 패턴과 일치하는지 비교하는 데 사용됩니다.
String data="java"
boolean result= Pattern.matches ("java",data);
예제 2:
String[] dataArr = { "moon", "mon", "moon", "mono" }
for (String str : dataArr) {
String PatternStr="m(o )n";
boolean result = Pattern.matches(patternStr, str)
if (result) {
System.out.println( "String " str " 패턴 일치 "patternStr "성공");
}
else{
System.out.println("string" str "패턴 일치" PatternStr "실패");
}
패턴은 "m(o )n"입니다. 이는 mn 중간에 있는 o가 한 번 이상 반복될 수 있으므로 moon, mon, moon이 일치할 수 있음을 의미합니다. n.o 뒤에 하나 더 있으면 패턴과 일치하지 않습니다.
참고:
는 0회 이상을 의미합니다. 🎜>
예시 3:
String[] dataArr = { "ban", "ben", "bin", "bon" ,"bun","byn","baen"}
for (String str : dataArr) {
String PatternStr="b[aeiou]n";
부울 결과 = Pattern.matches(patternStr, str)
if (result) {
System.out.println("string" str "match 패턴" PatternStr "성공");
}
else{
System.out.println("string" str "일치 패턴" PatternStr "실패");
}
}
참고: 정사각형 괄호 안에 허용되는 유일한 단일 문자는 "b[aeiou]n" 패턴으로 지정됩니다. b로 시작하고 n으로 끝나며 a, e, i, o, u는 중간에 일치하므로 배열의 처음 5개 문자는 일치할 수 있지만 마지막 두 요소는 일치할 수 없습니다.
대괄호 []는 그 안에 지정된 문자만 일치할 수 있음을 나타냅니다.
예제 4:
String[] dataArr = { "been", "bean", "boon", "buin" ," bynn"}
for (String str : dataArr) {
String PatternStr=" b(ee|ea|oo)n";
부울 결과 = Pattern.matches(patternStr, str);
if (결과) {
System.out.println("string" str "일치 패턴 " PatternStr "성공");
}
else{
System.out.println("character String " str "일치하는 패턴" PatternStr "실패");
}
}
여러 문자를 일치시켜야 하는 경우 []를 사용할 수 없습니다. 여기서는 ()와 |를 대신 사용할 수 있습니다. ()는 그룹을 나타내고 |는 or 관계를 나타내며 b(ee| ea|oo)n은 been, bean, boon 등과 일치할 수 있습니다.
따라서 처음 세 개는 일치할 수 있지만 후자 두 개는 일치할 수 없습니다.
예 5:
String[] dataArr = { "1", "10", "101 ", "1010" ,"100 "};
for (String str : dataArr) {
String PatternStr= "d ";
부울 결과 = Pattern.matches(patternStr, str);
if (결과) {
System.out.println("string" str "patternStr "성공") ;
}
else{
System.out.println("string" str "패턴 일치" PatternStr "실패")
}
}
참고: 위에서 알 수 있듯이 d는 숫자를 나타내고, 한 번 이상을 나타내므로 패턴 d는 하나 이상의 숫자를 나타냅니다.
따라서 처음 4개는 일치할 수 있고 마지막은 일치할 수 있습니다. 하나는 숫자가 아니기 때문에 일치할 수 없습니다.
[/code]
예 6:
String[] dataArr = { "a100", "b20", "c30", "df10000" ,"gh0t"};
for (String str : dataArr) {
String PatternStr="w d ";
boolean result = Pattern.matches(patternStr, str)
if (result)
System.out.println("string" str "일치하는 패턴" PatternStr "성공")
}
else{
System.out.println("String" str "일치하는 패턴" PatternStr "실패");
}
}
모드 w d는 여러 개의 단일 단어 문자로 시작하고 여러 숫자로 끝나는 문자열을 나타내므로 처음 4개는 일치할 수 있지만
예 7:
String str="급여, 직위명; 나이 및 성별"
String[] dataArr =str.split("[,s ;]");
for (String strTmp : dataArr) {
System .out.println(strTmp);
}
String 클래스의 분할 함수는 정규식을 지원합니다. 위의 예에서 패턴은 ",", 단일 공백 ";" 중 하나와 일치할 수 있으며, 분할 함수는 문자열을 문자열 배열로 분할하는 구분 기호로 사용할 수 있습니다. 예시 8:
String str= "2007년 12월 11일";
Pattern p = Pattern.compile("[일본 연도 및 월]")
String[] dataArr =p.split(str)
for (String strTmp: dataArr) {
System.out.println(strTmp);
}
Pattern은 정규 표현식의 컴파일된 표현식 패턴으로, 문자열을 효과적으로 분할할 수 있습니다.
예제 9:
코드 복사
코드는 다음과 같습니다. String str=" 10 yuan 1000 RMB 10000 yuan 100000RMB"
str=str.replaceAll("(d )(yuan|RMB|RMB)" , "\");
System.out.println(str);
위의 예에서는 "(d)(yuan|renminbi|RMB)" 패턴이 두 개로 나뉩니다. 첫 번째 그룹 d는 단일 또는 여러 숫자와 일치하고 두 번째 그룹은 위안화 및 인민폐 중 하나와 일치합니다. 대체 부분은 첫 번째 그룹의 일치 부분이 변경되지 않고 나머지 그룹이 대체됨을 의미합니다.
대체된 문자열은 PY10 ₩1000 ₩10000 ₩100000입니다.
예 10:
코드 복사
코드는 다음과 같습니다. Pattern p = Pattern.compile("m (o )n",Pattern.CASE_INSENSITIVE)
// matcher( ) Matcher 객체를 생성하는 Pattern 클래스의 메서드
Matcher m = p.matcher("moon mooon Mon mooooon Mooon")
StringBuffer sb = new StringBuffer()>// find( ) 첫 번째로 일치하는 객체를 찾는 메서드
boolean result = m.find()
// 루프를 사용하여 패턴 일치의 내용을 찾습니다. 이를 교체하고 해당 내용을 sb에 추가합니다.
while (result ) {
m.appendReplacement(sb, "moon");
result = m.find();
}
// 마지막으로,appendTail() 메서드를 호출하여 뒤에 남은 문자열을 추가합니다. sb에 대한 마지막 일치
m.appendTail(sb);
System.out.println("교체 후 내용은 " sb.toString ()); >예 11:
한 번 이상을 나타내는 *, 0번 이상을 나타내는 ? 외에도 {}를 사용하여 정확한 발생 횟수 X{2, 5}는 X가 최소 2번, 최대 5번 나타난다는 것을 의미합니다. 5}는 🎜>
String[] dataArr = { "google", "gooogle", "gooooogle", "gooooogle", "ggle"을 의미합니다. };
for (String str : dataArr) {
String PatternStr = " g(o{2,5})gle";
부울 결과 = Pattern.matches(patternStr, str); if (결과) {
System.out.println("string" str " 패턴 일치 "patternStr "성공")
} else { System.out.println("string" str "패턴 일치) " PatternStr "실패");
}
}
예 12: -from.. to...를 의미합니다. 예를 들어 [a-e]는 [abcde]와 동일합니다.
String[] dataArr = { "Tan", "Tbn", "Tcn", "Ton", " Twn"};
for (String str : dataArr) {
String regex = "T[a-c]n";
boolean result = Pattern.matches(regex, str);
if (result ) {
System .out.println("String" str "패턴 일치" regex "성공")
} else {
System.out.println("String" str "패턴 일치" regex " Failure");
}
}
예 13: 대소문자를 구분하지 않는 일치. 정규 표현식은 기본적으로 Pattern 을 사용하여 대소문자를 구분합니다. CASE_INSENSITIVE는 대소문자를 구분하지 않습니다.
String 패턴Str= "ab";
패턴 패턴=Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE)
String[] dataArr = { "ab", "Ab", "AB"}; for (String str : dataArr) {
Matcher matcher=pattern.matcher(str);
if(matcher.find()){
System.out.println("string" str "일치 패턴" PatternStr "success ");
}
}
예 14: 정규식을 사용하여 문자열을 분할합니다. >
코드 복사
String[] dataArr=pattern.split(input);
for (String str : dataArr) {
System.out.println ( str);
예 15: 괄호로 묶인 첫 번째 group1에 해당하는 정규식의 텍스트를 구문 분석합니다. 🎜>
코드 복사
코드는 다음과 같습니다.
String regex="<(w )>(w )< / >"; 패턴 패턴=Pattern.compile(regex);
예 16: 단어와 숫자가 혼합된 문자열의 단어 부분을 대문자로 표시합니다.
코드 복사
코드는 다음과 같습니다.
String regex="([a-zA-Z] [0-9] )" 패턴 패턴=패턴. compile(regex) ;
matcher.appendTail(sb); System.out.println("대체된 문자열은 " sb.toString());