Heim  >  Artikel  >  Web-Frontend  >  So vergleichen Sie eine Zeichenfolge mit einem regulären Ausdrucksmuster

So vergleichen Sie eine Zeichenfolge mit einem regulären Ausdrucksmuster

php中世界最好的语言
php中世界最好的语言Original
2018-03-29 11:00:193889Durchsuche

Dieses Mal erkläre ich Ihnen wie folgt, wie Sie ein reguläres Ausdrucksmuster mit einem String abgleichen und welche Vorsichtsmaßnahmen es gibt, damit ein reguläres Ausdrucksmuster mit einem String übereinstimmt Dies ist ein praktischer Fall, werfen wir einen Blick darauf.

Einführung

In tatsächlichen Projekten erfordert die Implementierung einer Funktion das Parsen einiger Zeichenfolgen in bestimmten Mustern. In der vorhandenen Codebasis werden einige der implementierten Funktionen zur Erkennung bestimmter Zeichen verwendet. Die Nachteile dieser Methode sind:

  • Logischerweise können leicht Fehler gemacht werden

  • Es ist leicht, die Überprüfung einiger Randbedingungen zu übersehen

  • Der Code ist komplex und schwer zu verstehen und zu warten

  • Schlechte Leistung

Ich habe gesehen, dass es einen CPP in der Codebasis gibt. Der gesamte CPP hat mehr als 2.000 Codezeilen. Es gibt eine Methode, die nur Zeichenfolgen analysiert mehr als 400 Zeilen! Wenn man die Charaktere einzeln vergleicht, ist es wirklich unansehnlich. Darüber hinaus sind viele der oben genannten Kommentare veraltet und auch die Schreibstile vieler Codes sind unterschiedlich. Grundsätzlich kann man davon ausgehen, dass sie von vielen Leuten geschrieben wurden.

In diesem Fall gibt es grundsätzlich keine Möglichkeit, diesen alten Weg fortzusetzen, daher liegt es nahe, über die Verwendung regulärer Ausdrücke nachzudenken. Ich habe keine praktische Erfahrung in der Anwendung regulärer Ausdrücke, insbesondere im Schreiben von Matching-Regeln. Das erste, woran ich dachte, war, einige Informationen im Internet zu finden, um ein allgemeines Verständnis zu erlangen. Aber das Ergebnis von Du Niang ist immer noch sehr enttäuschend. (Natürlich, wenn Sie nach mehr Fachwissen suchen möchten, werden die Ergebnisse von Du Niang jedes Mal herzzerreißend sein, und es sind alle die gleichen Kopien. Aber normalerweise ist Du Niangs Leben immer noch in Ordnung.) Später habe ich Du Niangs Frage aufgegeben Ergebnisse. FQ hat nach draußen gesucht und einige relativ einfache Videos gefunden (erfordert FQ).

Dieser Artikel kann als Zusammenfassung bezeichnet werden und stellt die Grundkenntnisse des Schreibens regulärer Ausdrücke zum Abgleichen von Zeichenfolgen vor. Es ist hauptsächlich in die folgenden zwei Teile unterteilt:

  1. Grundregeln für den Abgleich von Zeichenfolgen

  2. Regelmäßiger Abgleich, Suche und Ersetzung

Die in diesem Artikel vorgestellten Regeln für reguläre Ausdrücke sind ECMAScript. Die verwendete Programmiersprache ist C++. Weitere Aspekte werden nicht vorgestellt.

Grundregeln für das Zuordnen von Zeichenfolgen

1. Feste Zeichenfolgen abgleichen

regex e("abc");

2 . Passen Sie eine feste Zeichenfolge an, ohne Berücksichtigung der Groß- und Kleinschreibung

regex e("abc", regex_constants::icase);

3. Passen Sie ein weiteres Zeichen außerhalb der festen Zeichenfolge an, ohne Berücksichtigung der Groß- und Kleinschreibung

regex e("abc.", regex_constants::icase);  // .  Any character except newline. 1个字符4. Entspricht 0 oder 1 Zeichen

regex e("abc?");    // ?  Zero or 1 preceding character. 匹配?前一个字符5. Entspricht 0 oder mehr Zeichen

6 1 oder mehr Zeichen

regex e("abc*");    // *  Zero or more preceding character. 匹配*前一个字符

7. Übereinstimmung mit den Zeichen einer bestimmten Zeichenfolge

regex e("abc+");    // +  One or more preceding character. 匹配+前一个字符

8 -spezifische Zeichenfolge

regex e("ab[cd]*");    // [...] Any character inside square brackets. 匹配[]内的任意字符

9. Ordnen Sie einer bestimmten Zeichenfolge die angegebene Zahl zu

regex e("ab[^cd]*");    // [...] Any character not inside square brackets. 匹配非[]内的任意字符

10. 匹配特定字符串,指定数量范围

regex e("ab[cd]{3,}");  // {n} 匹配{}之前任意字符,且字符个数为3个或3个以上
regex e("ab[cd]{3,5}");  // {n} 匹配{}之前任意字符,且字符个数为3个以上,5个以下闭区间

11. 匹配规则中的某一个规则

regex e("abc|de[fg]");    // |  匹配|两边的任意一个规则

12. 匹配分组

regex e("(abc)de+");    // ()       ()表示一个子分组

13. 匹配子分组

regex e("(abc)de+\\1");  // ()    ()表示一个子分组,而\1表示在此位置匹配第一个分组的内容
regex e("(abc)c(de+)\\2\\1");  // \2 表示的是在此匹配第二个分组的内容

14. 匹配某个字符串开头

regex e("^abc."); 
// ^ begin of the string 查找以abc开头的子字符串

15. 匹配某个字符串结尾

regex e("abc.$");
// $ end of the string 查找以abc结尾的子字符串

      以上是最基本的匹配模式的书写。通常如果要匹配特定的字符,需要使用\进行转义,比如在匹配字符串中需要匹配".",那么在匹配字符串中应该在特定字符前加上\。出了以上的基本规则,如果还不满足特定的需要,那么可以参考此链接。使用了解基本的匹配模式后,需要使用正则表达式进行匹配、查找或者替代。

正则匹配、查找与替代

      书写好模式字符串后,需要将待匹配的字符串和模式字符串进行一定规则的匹配。包括三种方式:匹配(regex_match)、查找(regex_search)、替换(regex_replace)。

      匹配很简单,直接将待匹配字符串和模式字符串传入到regex_match中,返回一个bool量来指明待匹配的字符串是否满足模式字符串的规则。匹配整个str字符串。

bool match = regex_match(str, e);
// 匹配整个字符串str

      查找是在整个字符串中找到和满足模式字符串的子字符串。也就是只要str中存在满足模式字符串就会返回true。

bool match = regex_search(str, e);
// 查找字符串str中匹配e规则的子字符串

      但是很多情况下,光是返回一个是否匹配的bool量是不够的,我们需要拿到匹配的子字符串。那么就需要在模式字符串中将匹配字符串分组,参考【匹配字符串的基本规则】第12点。再将smatch传入到regex_search中,就可以获得满足每个子分组的字符串。

smatch m;
bool found = regex_search(str, m, e);
for (int n = 0; n < m.size(); ++n)
  {
    cout << "m[" << n << "].str()=" << m[n].str() << endl;
  }

    替换也是基于模式字符串在分组情况下完成的。

cout << regex_replace(str, e, "$1 is on $2");

      此时,会在满足分组1和分组2的字符串中间加上“ is on”。

      以上三个函数有很多版本的重载,可以满足不同情况下的需求。

实战

      要求:找出满足sectionA("sectionB")或者sectionA ("sectionB")的模式字符串。且分离出sectionA、sectionB。sectionA和sectionB不会出现数字,字符可大小写,至少有一个字符。

      分析:根据要求,大致可分为两个部分,也就是sectionA和sectionaB。这是就需要用到分组。

第一步:写出满足section情况的模式字符串

[a-zA-Z]+

第二步:在sectionA和sectionB中可能会出现空格。暂且假设至多有1个空格

\\s?

将以上两个情况组合起来,也就是能满足我们需求的模式字符串。但是如何组织才能让其分为两组呢?

[a-zA-Z]+\\s[a-zA-Z]+

上面这种写法肯定不对的,根据分组规则,需要将分组以()进行区分

regex e("([a-zA-Z]+)\\s?\\(\"([a-zA-Z]+)\"\\)");

      此时,在\\s?后面的\\(\"是为了满足sectionB外层的引号和括号进行的转义。

      以上完成后,可先用regex_match进行匹配,如果匹配,那么继续使用regex_search对字符串进行查找

if (regex_match(str, e))
{
 smatch m;
 auto found = regex_search(str, m, e);
 for (int n = 0; n < m.size(); ++n)
 {
 cout << "m[" << n << "].str()=" << m[n].str() << endl;
 }
}
else
{
 cout << "Not matched" << endl;
}

      对象m数组的第一个字符串是满足需求的整个子串,接下来才是满足分组1、分组2的子串。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

D-Metazeichen (entspricht „[^0-9]“) regulärer Ausdrücke werden im Detail verwendet

Reguläre Metazeichen und gewöhnliche Zeichen

Das obige ist der detaillierte Inhalt vonSo vergleichen Sie eine Zeichenfolge mit einem regulären Ausdrucksmuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn