이 기사의 예에서는 정규식 튜토리얼의 위치 일치에 대해 설명합니다. 다음과 같이 참조용으로 모든 사람과 공유하세요.
참고: 모든 예제에서 정규식 일치 결과는 소스 텍스트의 [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 문서는 모두 b6d35b8c14fd1ac10981463c0c988a5c로 시작합니다.
텍스트:
<?xml version="1.0" encoding="UTF-8"?> <project basedir="." default="ear"> </project>
정규식: ^s*2948bc3d3f70fe7c444d1a66aa111387
결과:
13cf11232ae92060aefa0d5e3a658908
5b356781b62110963958b5153d35896a
1755c7176d4002e2a322de4f48c796fa
분석: ^ 문자열의 시작 부분과 일치합니다. 따라서 ^s*는 문자열의 시작 부분과 그 이후의 0개 이상의 공백 문자와 일치합니다. 공백, 탭, 개행 문자 등이 8a82eb472d64dd53782fcc091813a312 태그 앞에 허용되기 때문입니다. 문자.
$ 메타 문자의 사용법은 위치의 차이를 제외하면 ^의 사용법과 완전히 동일합니다. 예를 들어 HTML 페이지가 73a6ac4ed44ffec12cee46588e518a5e로 끝나는지 확인하려면 다음 패턴을 사용할 수 있습니다. afffb3cd0bb4596915bc8423c6ca1968s*$
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中文网!