>  기사  >  웹 프론트엔드  >  정규식 튜토리얼을 위한 위치 매칭 튜토리얼(코드 포함)

정규식 튜토리얼을 위한 위치 매칭 튜토리얼(코드 포함)

php中世界最好的语言
php中世界最好的语言원래의
2018-03-29 18:03:131474검색

이번에는 정규식 위치 매칭 튜토리얼(코드 포함)을 가져왔습니다. 정규식 튜토리얼 위치 매칭 사용 시 주의사항은 무엇인가요? 실제 사례를 살펴보겠습니다.

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

참고: 모든 예제에서 정규식 일치 결과는 소스 텍스트의 [] 사이에 포함됩니다. 일부 예제는 Java를 사용하여 구현됩니다. Java 자체에서 정규식을 사용하는 방법에 대해서는 해당 부분에서 설명하겠습니다. 모든 Java 예제는 JDK1.6.0_13에서 테스트되었습니다.

1. 문제 소개

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

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

정규식: is

결과: 어제 【is】 h【is】tory, 내일 【is】 미스터리인데 오늘 【is】 선물입니다.

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

2. 단어 경계

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

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

정규식: bisb

결과: 어제 【is】 역사, 내일 【is】 수수께끼인데 오늘 【is】 선물입니다.

분석: 원문에서 is라는 단어 앞뒤에 공백이 있는데, 이는 bisb 패턴과 일치합니다(공백은 다음과 같습니다. 문자 중 하나를 단어로 분리하세요). History라는 단어에도 is가 포함되어 있습니다. 그 이유는 이 두 문자 중 어느 것도 b와 일치할 수 없기 때문입니다.

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

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

정규식: B-B

결과: 【9자리】를 입력하세요. 색상에 표시된 ID - coded [pass-key].

분석: B-B는 9-에서 하이픈 앞뒤에 단어 경계가 아닌 하이픈을 일치시킵니다. digit 및 pass-key. 이므로 일치할 수 있지만 색상으로 구분된 하이픈 앞뒤에 공백이 있어 일치할 수 없습니다.

3. StringBoundary

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

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

텍스트:

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="ear">
</project>

正则表达式:^\s*<\?xml.*?\?>

结果:



分析:^匹配一个字符串的开头位置,所以^\s*将匹配一个字符串的开头位置和随后的零个或多个空白字符,因为标签前面允许有空格、制表符、换行符等空白字符。

$元字符符的用法除了位置上的差异外,与^用法完全一样。比如,检查一个html页面是否以结尾,可以用模式:\s*$

四、多行匹配模式

正则表达式可以通过一些特殊的元字符来改变另外一些元字符的行为。可以通过(?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());
  }
}

输出结果如下:

//대화 상자가 모달임을 지정하여 수퍼 생성자를 호출합니다.
//대화 상자 제목을 설정합니다.
//"X"를 클릭해도 창이 닫히지 않도록 지시합니다.
//좋은 테두리가 있는 메시지를 넣습니다. 이 대화 상자.
//대화 상자 크기를 구성 요소로 조정합니다.
//응용 프로그램 위에 대화 상자를 가운데에 배치합니다.

5. 요약

정규식은 모든 길이의 텍스트 블록을 일치시키는 데 사용할 수 없습니다. 문자열의 특정 위치에 나타납니다. b는 단어 경계를 지정하는 데 사용됩니다(B는 정반대입니다). ^ 및 $는 단어 경계를 지정하는 데 사용됩니다. (?m)과 함께 사용하면 ^ 및 $는 개행 문자로 시작하거나 끝나는 문자열과도 일치합니다. 하위 표현식의 사용은 다음 기사에서 소개됩니다.

이 기사의 사례를 읽으신 후 방법을 마스터하셨다고 믿습니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요!

추천 자료:

연속된 숫자를 정규식으로 일치시키는 방법

정규식으로 최소 일치를 구현한 개발 경험

위 내용은 정규식 튜토리얼을 위한 위치 매칭 튜토리얼(코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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