>  기사  >  Java  >  Java는 문자열 일치를 구현합니다(규칙성을 기반으로 함).

Java는 문자열 일치를 구현합니다(규칙성을 기반으로 함).

高洛峰
高洛峰원래의
2017-01-16 11:05:091678검색

문자열이 있는데, 거기에 y와 f 문자가 있는지 어떻게 확인하나요? 가장 어두운 방법은 다음과 같습니다.

프로그램 1: if, for 문 및 charAt()

class Test{
 public static void main(String args[]) {
  String str="For my money, the important thing "+"about the meeting was bridge-building";
  char x='y';
  char y='f';
  boolean result=false;
  for(int i=0;i<str.length;i++){
   char z=str.charAt(i); //System.out.println(z);
   if(x==z||y==z) {
    result=true;
    break;
   }
   else result=false;
  }
  System.out.println(result);
 }
}

매우 직관적인 것처럼 보이지만 이 방법은 대처하기 어렵습니다. 복잡성. 예를 들어, 텍스트에 이 있는지 쿼리해 보세요. 무슨 일이 있거나 팅 등등이 있나요? 그것은 불쾌한 직업입니다.

Java의 java.util.regex 패키지

객체지향 개념에 따르면 is, thing, ting 등 쿼리하려는 문자열을 객체로 캡슐화하고, 이 객체는 일치하는 템플릿으로 사용됩니다. 텍스트 단락이 더욱 자연스러워집니다. 템플릿 역할을 하는 것은 아래에서 설명할 정규식입니다. 복잡성을 무시하고 예를 살펴보겠습니다. 프로그램 2: 이해가 안 됩니다. 먼저 살펴볼까요?

import java.util.regex.*;
 
class Regex1{
 public static void main(String args[]) {
  String str="For my money, the important thing "+"about the meeting was bridge-building";
  String regEx="a|f"; //表示a或f
  Pattern p=Pattern.compile(regEx);
  Matcher m=p.matcher(str);
  boolean result=m.find();
  System.out.println(result);
 }
}

str이 regEx와 일치하면 결과는 true이고, 그렇지 않으면 false입니다. 검색 시 대소문자를 무시하고 싶다면 다음과 같이 쓸 수 있습니다:

Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);

비록 패턴은 모르지만(템플릿, 패턴 ) 및 Matcher(매처)의 세부 사항을 사용하면 프로그램이 더 편안해집니다. is를 먼저 쿼리한 다음 thing 또는 ting을 쿼리하는 경우 if 문과 for 문을 고려하거나 charAt를 통해 템플릿 패턴만 수정하면 됩니다. () .

1. 특수 문자열(a|f와 같은 정규 표현식)을 작성합니다.

2. 정규 표현식을 템플릿으로 컴파일합니다: p

3. 템플릿 p를 사용하여 문자열 str과 일치시킵니다.

아이디어는 분명합니다. 이제 Java가 이를 어떻게 처리하는지 살펴보겠습니다. (Java 프로그래머는 JDK1.4까지 이 클래스를 사용할 수 없습니다.

패턴 클래스 및 검색

 ①public final class java .util.regex.Pattern은 정규식의 컴파일된 표현식입니다. 다음 명령문은 Pattern 객체를 생성하고 이를 핸들 p에 할당합니다. Pattern p=Pattern.compile(regEx);

흥미롭게도 Pattern 클래스는 최종 클래스이고 해당 생성자는 비공개입니다. 누군가가 디자인 패턴에 대해 이야기했거나 관련 정보를 직접 확인할 수 있습니다. 여기서 결론은 Pattern 클래스는 상속될 수 없으며 Pattern 클래스를 만들 수 없다는 것입니다.

따라서 Pattern 클래스에는 다음과 같이 반환 값이 Pattern 개체(참조)인 두 개의 오버로드된 정적 메서드가 제공됩니다. 🎜> 물론 Pattern p=null과 같이 Pattern 클래스의 핸들을 선언할 수 있습니다.

 ②p.matcher(str)는 템플릿 p를 사용하여 문자열 str에 대한 일치자를 생성하는 것을 의미합니다. 반환 값은 Matcher 클래스 참조입니다. 왜 이것이 필요합니까? 자연스러운 생각에 따르면 간단히 다음 방법을 사용할 수 있습니까?

다음과 같이 코드를 복사하세요.

boolean result=Pattern.compile(regEx).matcher(str).find();


실제로 핸들이 없는 문 병합 방법은 좋은 방법이 아닌 경우가 많습니다. 먼저 Matcher 클래스에 대해 알아보겠습니다. 정규 표현식(Regular Expression)을 살펴보겠습니다. 예를 들어 String regEx="me+"; 문자열 me+가 생성할 수 있는 문자열은 me, mee, meee, meeeeeeeee 등입니다. 정규 표현식은 무한한 문자열을 생성할 수 있으므로 불가능합니다. 필요합니까?) 정규식

에 의해 생성된 모든 것을 출력하려면 문자열의 경우 me, mee, meee, meeeeeeeeeee 등을 고려하십시오. 분명히, 정규식 언어는 이 언어로, 일부 문자열에 대한 간결하고 심오한 설명입니다.


문자열 검색, 일치, 지정된 문자열 바꾸기, 문자열 분할 등에 정규식을 사용합니다.

문자열을 생성하는 문자열 - 정규식은 실제로 약간 복잡합니다. 왜냐하면 일반 문자(예: a~z 문자)와 특수 문자(메타 문자라고 함)로 문자열을 설명하고 싶기 때문입니다. 정확한.

몇 가지 정규식 예를 살펴보겠습니다.

프로그램 3: 우리는 항상 이 프로그램을 사용하여 정규식을 테스트합니다

public static Pattern compile(String regex) {
 return new Pattern(regex, 0);
}

 ①"ab* "——a, ab, abb, abbb와 일치할 수 있습니다.... 따라서 *는 앞의 문자가 0번 이상 나타날 수 있음을 의미합니다. 검색만 고려한다면 "a"를 직접 사용하세요. 그러나 교체 상황을 생각해보십시오. regEx="abb*" 질문의 결과는 무엇입니까?

②"ab+" - ab, abb, abbb와 일치할 수 있습니다... "abb*"와 동일합니다. regEx="or+" 질문의 결과는 무엇입니까?

  ③"or?" ——o 및 or와 일치할 수 있습니다. ?는 앞의 문자가 0개 또는 1개일 수 있음을 의미합니다.

이러한 한정자 *, +, ?는 앞의 문자(하위 문자열)가 나타나는 횟수를 편리하게 나타냅니다(이를 설명하기 위해 {}를 사용함): x*, 0회 이상 ל{0,}

위 내용이 이 글의 전체 내용입니다. 모두가 정규 표현식의 힘을 깨닫는 데 도움이 되기를 바랍니다.

Java의 문자열 일치(정규 규칙 기반)와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.