Heim > Artikel > Backend-Entwicklung > Ausführliche Erläuterung des Positionsabgleichs im Tutorial zu regulären Ausdrücken
Das Beispiel in diesem Artikel beschreibt das Tutorial zum Positionsabgleich von regulären Ausdrücken. Teilen Sie es wie folgt mit allen:
Hinweis: In allen Beispielen sind die Ergebnisse der regulären Ausdrücke zwischen [und] im Quelltext enthalten. Einige Beispiele werden mit Java implementiert Der Einsatz regulärer Ausdrücke in Java selbst wird an den entsprechenden Stellen erläutert. Alle Java-Beispiele werden unter JDK1.6.0_13 getestet.
1. Einführung in das Problem
Wenn Sie ein bestimmtes Wort in einem Textstück zuordnen möchten (den mehrzeiligen Modus vorerst nicht berücksichtigen, der später eingeführt wird), können wir kann wie folgt aussehen:
Text: Gestern ist Geschichte, morgen ist ein Geheimnis, aber heute ist ein Geschenk.
Regulärer Ausdruck: ist
Ergebnis: Gestern [ist ] h [ist] Geschichte, morgen „ist“ ein Rätsel, aber heute „ist“ ein Geschenk.
Analyse: Ursprünglich wollte es nur mit dem Wort „ist“ übereinstimmen, aber es passte auch zu „ist“, das in anderen Worten enthalten ist . Um dieses Problem zu lösen, verwenden Sie Grenztrennzeichen. Dabei handelt es sich um Metazeichen, die in regulären Ausdrücken verwendet werden, um anzugeben, wo (oder an welchen Grenzen) der Vergleichsvorgang stattfinden soll.
2. Wortgrenzen
Eine häufig verwendete Grenze ist die durch das Qualifikationsmerkmal b angegebene Wortgrenze, die verwendet wird, um den Anfang und das Ende eines Wortes abzugleichen. Genauer gesagt entspricht es einer Position zwischen einem Zeichen, das zur Bildung eines Wortes verwendet werden kann (Buchstabe, Zahl, Unterstrich, das ist das Zeichen, das mit w übereinstimmt) und einem Zeichen, das nicht zur Bildung eines Wortes verwendet werden kann (wobei W mit Zeichen übereinstimmt). . Schauen wir uns das vorherige Beispiel an:
Text: Gestern ist Geschichte, morgen ist ein Rätsel, aber heute ist ein Geschenk.
Regulärer Ausdruck: bisb
Ergebnis: Gestern [ is】 Geschichte, morgen 【is】 ein Mysterium, aber heute 【is】 ein Geschenk.
Analyse: Im Originaltext gibt es ein Leerzeichen vor und nach dem Wort is, und dies entspricht dem Muster bisb ( das Leerzeichen ist eines der Zeichen, die zum Trennen von Wörtern verwendet werden). Das Wort „history“ enthält auch „is“, da davor und danach zwei Zeichen „h“ und „t“ stehen. Keines dieser beiden Zeichen kann mit „b“ übereinstimmen.
Wenn eine Wortgrenze nicht übereinstimmt, wird B verwendet. Zum Beispiel:
Text: Bitte geben Sie die neunstellige ID ein, wie sie auf Ihrem farbcodierten Passschlüssel erscheint.
Regulärer Ausdruck: B-B
Ergebnis: Bitte eingeben die [neunstellige] ID, wie sie auf Ihrem farbcodierten [Passwort] erscheint.
Analyse: B-B entspricht einem Bindestrich, der keine Wortgrenze davor und danach darstellt, in neunstelliger Form und Pass -key Es gibt keine Leerzeichen vor und nach dem Bindestrich, sodass eine Übereinstimmung möglich ist. Bei der Farbcodierung sind jedoch Leerzeichen vor und nach dem Bindestrich vorhanden, sodass eine Übereinstimmung nicht möglich ist.
3. Zeichenfolgengrenzen
Wortgrenzen können verwendet werden, um Positionen im Zusammenhang mit Wörtern abzugleichen (Wortanfang, Wortende, ganzes Wort usw.). Zeichenfolgengrenzen haben einen ähnlichen Zweck, werden jedoch verwendet, um Positionen in Bezug auf Zeichenfolgen abzugleichen (Anfang der Zeichenfolge, Ende der Zeichenfolge, gesamte Zeichenfolge usw.). Es gibt zwei Metazeichen, die zum Definieren von Zeichenfolgengrenzen verwendet werden: eines ist ^, das den Anfang der Zeichenfolge definiert, und das andere ist $, das verwendet wird, um das Ende der Zeichenfolge zu definieren.
Wenn Sie beispielsweise die Rechtmäßigkeit eines XML-Dokuments überprüfen möchten, beginnen alle rechtlichen XML-Dokumente mit b6d35b8c14fd1ac10981463c0c988a5c:
Text:
<?xml version="1.0" encoding="UTF-8"?> <project basedir="." default="ear"> </project>
Regulärer Ausdruck: ^s*2948bc3d3f70fe7c444d1a66aa111387
Ergebnis:
b0f0ceb078d5115dedd6542ebf644a2a
5b356781b62110963958b5153d35896a
1755c7176d4002e2a322de4f48c796fa
Analyse: ^ Entspricht dem Anfang einer Zeichenfolge, sodass ^s* mit dem Anfang einer Zeichenfolge und den darauffolgenden null oder mehr Leerzeichen übereinstimmt, da Leerzeichen, Tabulatoren, Zeilenumbrüche usw. vor dem Leerzeichen des 8a82eb472d64dd53782fcc091813a312-Tags zulässig sind Charaktere.
Die Verwendung des Metazeichens $ ist bis auf den Unterschied in der Position genau die gleiche wie die Verwendung von ^. Um beispielsweise zu überprüfen, ob eine HTML-Seite mit 73a6ac4ed44ffec12cee46588e518a5e endet, können Sie das Muster verwenden: afffb3cd0bb4596915bc8423c6ca1968s*$
4 . Mehrzeiliger Abgleich Der reguläre Ausdruck
des Musters kann einige spezielle Metazeichen verwenden, um das Verhalten anderer Metazeichen zu ändern. Der Multiline-Matching-Modus kann über (?m) aktiviert werden. Das mehrzeilige Übereinstimmungsmuster führt dazu, dass die Engine für reguläre Ausdrücke das Zeilentrennzeichen als Zeichenfolgentrennzeichen behandelt. Im mehrzeiligen Vergleichsmodus stimmt ^ nicht nur mit dem normalen Anfang der Zeichenfolge überein, sondern auch mit der Startposition nach dem Zeilentrennzeichen (das Zeilenumbruchzeichen $ stimmt nicht nur mit dem normalen Ende der Zeichenfolge überein, sondern auch mit dem Zeilentrennzeichen). (Neuzeilenzeichen). Die Endposition dahinter.
Bei Verwendung muss (?m) vorne im gesamten Muster erscheinen. Verwenden Sie beispielsweise reguläre Ausdrücke, um alle einzeiligen Kommentare (beginnend mit //) in einem Java-Code zu finden.
Text:
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); }
Regulärer Ausdruck: (?m)^s*//.*$
Ergebnis:
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中文网!