정규식 튜토리얼의 위치 일치에 대한 자세한 설명

高洛峰
풀어 주다: 2023-03-04 17:44:01
원래의
2011명이 탐색했습니다.

이 기사의 예에서는 정규식 튜토리얼의 위치 일치에 대해 설명합니다. 다음과 같이 참조용으로 모든 사람과 공유하세요.

참고: 모든 예제에서 정규식 일치 결과는 소스 텍스트의 [and] 사이에 포함됩니다. Java 자체의 정규식에 대한 설명은 해당 위치에서 설명합니다. 모든 Java 예제는 JDK1.6.0_13에서 테스트되었습니다.

1. 문제 소개

텍스트에서 특정 단어를 일치시키려는 경우(나중에 소개할 다중 줄 모드는 고려하지 않음) 다음과 같이 보일 수 있습니다.

텍스트: 어제는 역사이고 내일은 미스터리입니다. 하지만 오늘은 선물입니다.

정규 표현식: is

결과: 어제 [is ] h [is] 이야기, 내일은 [is] 미스터리지만 오늘은 선물입니다.

분석: 원래는 is라는 단어만 일치시키려고 했으나, 다른 단어에 포함된 the도 일치했습니다. . 이 문제를 해결하려면 경계 구분 기호를 사용하세요. 경계 구분 기호는 정규식에서 일치 작업이 수행되기를 원하는 위치(또는 경계)를 나타내는 데 사용되는 메타 문자입니다.

2. 단어 경계

일반적으로 사용되는 경계는 단어의 시작과 끝을 일치시키는 데 사용되는 한정자 b로 지정되는 단어 경계입니다. 보다 정확하게는 단어를 형성하는 데 사용할 수 있는 문자(문자, 숫자, w와 일치하는 문자인 밑줄)와 단어를 형성하는 데 사용할 수 없는 문자(W는 문자와 일치) 사이의 위치를 ​​일치시킵니다. . 이전 예를 살펴보겠습니다.

텍스트: 어제는 역사이고 내일은 미스터리이지만 오늘은 선물입니다.

정규식: bisb

결과: 어제 [ is】 History, Tomorrow 【is】는 미스터리지만 today 【is】는 선물입니다.

분석: 원문에서 is라는 단어 앞뒤에 공백이 있고 이는 패턴 bisb( 공백은 단어를 구분하는 데 사용되는 문자 중 하나입니다. History라는 단어에도 is가 포함되어 있습니다. 그 이유는 이 두 문자 중 어느 것도 b와 일치할 수 없기 때문입니다.

단어 경계가 일치하지 않으면 B를 사용합니다. 예:

텍스트: 색상 코드 패스 키에 표시된 9자리 ID를 입력하세요.

정규 표현식: B-B

결과: 입력하세요. 색상에 표시된 [9자리] ID - 코드화된 [pass-key]

분석: B-B는 9자리로 앞뒤에 단어 경계가 아닌 하이픈을 일치시킵니다. -key 하이픈 앞뒤에 공백이 없어 일치할 수 없습니다. 그러나 색상으로 구분한 경우 하이픈 앞뒤에 공백이 있으므로 일치할 수 없습니다.

3. 문자열 경계

단어 경계는 단어와 관련된 위치(단어의 시작, 단어의 끝, 전체 단어 등)를 일치시키는 데 사용할 수 있습니다. 문자열 경계는 비슷한 목적을 가지고 있지만 문자열과 관련된 위치(문자열의 시작, 문자열의 끝, 전체 문자열 등)를 일치시키는 데 사용됩니다. 문자열 경계를 정의하는 데 사용되는 메타 문자는 두 가지가 있습니다. 하나는 문자열의 시작을 정의하는 데 사용되는 ^이고 다른 하나는 문자열의 끝을 정의하는 데 사용되는 $입니다.

예를 들어 XML 문서의 적법성을 확인하려는 경우 법적 XML 문서는 모두 로 시작합니다.

텍스트:

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="ear">
</project>
로그인 후 복사

정규식: ^s*

결과:



분석: ^ 문자열의 시작 부분과 일치합니다. 따라서 ^s*는 문자열의 시작 부분과 그 이후의 0개 이상의 공백 문자와 일치합니다. 공백, 탭, 개행 문자 등이 태그 앞에 허용되기 때문입니다. 문자.

$ 메타 문자의 사용법은 위치의 차이를 제외하면 ^의 사용법과 완전히 동일합니다. 예를 들어 HTML 페이지가 로 끝나는지 확인하려면 다음 패턴을 사용할 수 있습니다. s*$

4 . 다중 행 일치

패턴 정규식은 일부 특수 메타 문자를 사용하여 다른 메타 문자의 동작을 변경할 수 있습니다. 여러 줄 일치 모드는 (?m)을 통해 활성화할 수 있습니다. 여러 줄 일치 패턴을 사용하면 정규식 엔진이 줄 구분 기호를 문자열 구분 기호로 처리하게 됩니다. 여러 줄 일치 모드에서 ^는 문자열의 일반적인 시작과 일치할 뿐만 아니라 줄 구분 기호(개행 문자) 뒤의 시작 위치와도 일치합니다. $는 문자열의 일반적인 끝과 일치할 뿐만 아니라 줄 구분 기호와도 일치합니다. (개행 문자) 뒤에 있는 끝 위치입니다.

사용시 전체 패턴 앞에 (?m)이 나타나야 합니다. 예를 들어 정규식을 사용하여 Java 코드에서 //로 시작하는 모든 한 줄 주석을 찾습니다.

텍스트:

publicDownloadingDialog(Frame parent){
     //Callsuper constructor, specifying that dialog box is modal.
     super(parent,true);
     //Setdialog box title.
     setTitle("E-mailClient");
     //Instructwindow not to close when the "X" is clicked.
     setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
     //Puta message with a nice border in this dialog box.
     JPanelcontentPanel = new JPanel();
     contentPanel.setBorder(BorderFactory.createEmptyBorder(5,5, 5, 5));
     contentPanel.add(newJLabel("Downloading messages..."));
     setContentPane(contentPanel);
     //Sizedialog box to components.
     pack();
     //Centerdialog box over application.
     setLocationRelativeTo(parent);
}
로그인 후 복사

정규식: (?m)^s*//.*$

결과:

publicDownloadingDialog(Frame parent){
【 //Call superconstructor, specifying that dialog box is modal.】
super(parent,true);
【 //Set dialog boxtitle.】
setTitle("E-mailClient");
【 //Instruct windownot to close when the "X" is clicked.】
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
【 //Put a messagewith a nice border in this dialog box.】
JPanelcontentPanel = new JPanel();
contentPanel.setBorder(BorderFactory.createEmptyBorder(5,5, 5, 5));
contentPanel.add(newJLabel("Downloading messages..."));
setContentPane(contentPanel);
【 //Size dialog boxto components.】
pack();
【 //Center dialogbox over application.】
setLocationRelativeTo(parent);
}

分析:^\s*//.*$将匹配一个字符串的开始,然后是任意多个空白字符,再后面是//,再往后是任意文本,最后是一个字符串的结束。不过这个模式只能找出第一条注释,加上(?m)前缀后,将把换行符视为一个字符串分隔符,这样就可以把每一行注释匹配出来了。

java代码实现如下(文本保存在text.txt文件中):

public static String getTextFromFile(String path) throws Exception{
  BufferedReader br = new BufferedReader(new FileReader(new File(path)));
  StringBuilder sb = new StringBuilder();
  char[] cbuf = new char[1024];
  int len = 0;
  while(br.ready() && (len = br.read(cbuf)) > 0){
    br.read(cbuf);
    sb.append(cbuf, 0, len);
  }
    br.close();
  return sb.toString();
}
public static void multilineMatch() throws Exception{
  String text = getTextFromFile("E:/text.txt");
  String regex = "(?m)^\\s*//.*$";
  Matcher m = Pattern.compile(regex).matcher(text);
  while(m.find()){
    System.out.println(m.group());
  }
}
로그인 후 복사

   

输出结果如下:

//Call super constructor, specifying that dialog box is modal.
//Set dialog box title.
//Instruct window not to close when the "X" is clicked.
//Put a message with a nice border in this dialog box.
//Size dialog box to components.
//Center dialog box over application.

五、小结

正则表达式不仅可以用来匹配任意长度的文本块,还可以用来匹配出现在字符串中特定位置的文本。\b用来指定一个单词边界(\B刚好相反)。^和$用来指定单词边界。如果与(?m)配合使用,^和$还将匹配在一个换行符处开头或结尾的字符串。在接下来的文章中将介绍子表达式的使用。

希望本文所述对大家正则表达式学习有所帮助。

更多正则表达式教程之位置匹配详解相关文章请关注PHP中文网!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!