最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

正則表達式 以及 北太天元的regex插件對正則字符串的支持

2023-08-11 19:45 作者:盧朓  | 我要投稿

正則表達式,也稱為 regex 或 RegExp,是一個字符串,用于描述或匹配一系列具有相似模式的字符串。它是編程語言中的一種工具,可以幫助我們搜索、替換、刪除或處理文本。

正則表達式由一系列字符組成,這些字符可以是普通字符(如 a-z,A-Z,0-9),也可以是特殊字符(如 .,[,$ 等)。這些特殊字符被稱為元字符,它們具有特殊的含義,可以用來表示特定的模式。

幾乎所有的編程語言都支持正則表達式。C++從C++11開始直接支持正則表達式。除了編程語言之外,大多數(shù)文本處理程序(如vim)都使用正則表達式。

在這個小短文中,我們將探討正則表達式的一般細節(jié)以及C++編程方面的細節(jié)。

從C++11開始,C++通過<regex>標頭的標準庫提供regex支持。C+11使用ECMAScript語法作為regex的默認語法。ECMAScript很簡單,但它提供了強大的regex功能。為了把C++11的正則表達式引入到北太天元,我寫了一個regex插件。在北太天元中使用正則表達式, 先加載 regex 插件.? 可以通過在命令行窗口輸入
>> load_plugin("regex")
來加載regex插件。

我們先看看在正則表達式中指定范圍和指定重復的一些模式(pattern).

范圍指定

例如,我們可以指定從a到z的小寫字母范圍,如下所示:
[a-z]? ?
這將恰好匹配一個小寫字符。

[A-Za-z0-9]
上面的表達式指定包含一個大寫字符、一個小寫字符和一個從0到9的數(shù)字的范圍。這將匹配
一個大寫字母或者一個小寫字母或者0-9之間的一個數(shù)字。


上述表達式中的方括號[]具有特殊含義,即它們用于指定范圍。如果要在表達式中包含一個方括號,
則需要對其進行轉(zhuǎn)義。 因此,下面的表達式,
[\[0-9]
上面的表達式表示一個左方括號和一個范圍為0到9的數(shù)字作為正則表達式。這將匹配
一個左方括號或者0到9中的一個數(shù)字。

但請注意,當我們用C++編程時,我們需要使用C++特定的轉(zhuǎn)義序列,如下所示:
[\\[0-9]
也就是說為了在C++中輸入 \[ 需要輸入 \\[,
在北太天元總也是如此,我們用北太天元舉例:

Input [12] >> str = "AZ12["
str =
? 1x1 string
??? "AZ12["

Input [13] >> [找到的字符串,前綴,后綴] = regex_search(str, "[\[]")
輸入字符串分析失敗,分析器已重置。
錯誤(文件 stdin, 行1, 列37): 單引號字符矩陣模式下此輸入無效

上面的解析報了錯,需要修改成這樣
Input [14] >> [找到的字符串,前綴,后綴] = regex_search(str, "[\\[]")
找到的字符串 =
? 1x1 string
??? "["

另外,我們再強調(diào)一下 [\[0-9]] 只會配一個字符,我們用北太天元來執(zhí)行
Input [15] >> [找到的字符串,前綴,后綴] = regex_search(str, "[\\[0-9]")
找到的字符串 =
? 1x1 string
??? "1"
這里的str = "AZ12[", 用 [\[0-9] 只匹配了第一個屬于這個范圍的字符 1, 后main 2[ 都成了后綴.

再看下面的例子,"AZ12[" 要查找[A-Z\[0-9]]時,就匹配了第一個找到的在此范圍的字符A.
Input [16] >> [找到的字符串,前綴,后綴] = regex_search(str, "[A-Z\\[0-9]")

找到的字符串 =

? 1x1 string

??? "A"


重復pattern

我們在上面指定的范圍示例只匹配一個字符或文字。如果我們想匹配多個字符,我們通常會在
指定模式的同時指定“表達式修飾符”,從而使其成為重復模式。

表達式修飾符可以是“+”,表示匹配模式的出現(xiàn)一次或多次,
也可以是“*”,表示將模式的出現(xiàn)匹配零次或多次。


例如以下表達式,

[a-z]+匹配a、aaa、abcd、softwaretestinghelp等字符串。請注意,它永遠不會匹配空白字符串。
北太天元的命令
[a-z]*將匹配一個空白字符串或以上任何字符串。

Input [20] >> [找到的字符串,~,~] = regex_search("az123", "[A-Z]+")
找到的字符串 =
? 0x0 empty string
Input [21] >> [找到的字符串,~,~] = regex_search("az123", "[A-Z]*")
找到的字符串 =
? 1x1 string
??? ""
我們可以看到[A-Z]+ 要求至少要有一個大寫字符,因此找到的字符串 = 0x0 empty string
意味著沒有找到, 而 [A-Z]* 表示0個或者以上的大寫字符,因此找到的字符串是1x1 string
只不過這個string 是 "".
如果確實存在大寫字符,[A-Z]* 和 [A-Z]+ 返回的結(jié)果是一樣的
Input [24] >> [找到的字符串,~,~] = regex_search("AZ123", "[A-Z]*")
找到的字符串 =
? 1x1 string
??? "AZ"
Input [25] >> [找到的字符串,~,~] = regex_search("AZ123", "[A-Z]+")
找到的字符串 =
? 1x1 string
??? "AZ"
如果要指定一組字符匹配一次或多次,則可以使用括號,如下所示:
(Xyz)+
上述表達式將匹配Xyz、XyzXyz和XyzXyzXyz等。
例如在北太天元上
Input [39] >> [找到的字符串,q,h] = regex_search("abc12XyzXyzXyz124", "(Xyz)+")
找到的字符串 =
? 1x2 string
? 列 1
??? "XyzXyzXyz"
? 列 2
??? "Xyz"
q =
? 1x5 char
??? 'abc12'
h =
? 1x3 char
??? '124'
這個感覺插件似乎有點問題,找到的字符串應(yīng)該還是1x1 string 才對,現(xiàn)在多了1列。

正則表達式一個稍微有點使用價值的例子

考慮一個與微軟DOS文件名匹配的正則表達式,如下所示。
>>regex_filename="[a-zA-Z_][a-zA-Z_0-9]*\\.[a-zA-Z0-9]+";

上述正則表達式可以解釋如下:
匹配字母(先小寫后大寫)或下劃線。然后匹配零個或多個字符,每個字符可以是字母、下劃線或數(shù)字。然后匹配一個文字點(.)。在點之后,匹配一個或多個字符,其中每個字符都可以是表示文件擴展名的字母或數(shù)字。

Input [42] >> [找到的字符串,q,h] = regex_search("12.m", regex_filename)
找到的字符串 =
? 0x0 empty string
上面的文件名12.m不是用字母或者下劃線開頭的,因此是非法的,上面的regex_search返回
找到的字符串是 0x0 empty string
我們可以用北太天元的 isempty 命令來判別這一點,從而知道這是一個非法的文件名 。
Input [43] >> isempty(找到的字符串)
ans =
? 1x1 logical
?? 1
Input [44] >> [找到的字符串,q,h] = regex_search("_12.m", regex_filename)
找到的字符串 =
? 1x1 string
??? "_12.m"
這個說明"_12.m" 是一個合法的文件名.

regex_match 的用法可以用北太天元的 help regex_match 獲得
Input [45] >> help regex_match

正則表達式匹配
語法 smatch = regex_match(str, pattern)
例:
Input [29] >>?? ?str = "CN2018_BEIJING";
Input [30] >> patstr = "CN\\d*_BEIJING";
Input [31] >> s = regex_match(str, patstr)
s =
? 1x1 string
??? "CN2018_BEIJING"
Input [32] >> patstr = "CN(\\d*)_BEIJING";
Input [33] >> s = regex_match(str, patstr)
s =
? 1x2 string
??? "CN2018_BEIJING"??? "2018"
Input [34] >> patstr = "CN(\\d*)_[A-Z]*";
Input [35] >> s = regex_match(str, patstr)
s =
? 1x2 string
??? "CN2018_BEIJING"??? "2018"
Input [36] >> patstr = "CN(\\d*)_([A-Z]*)";
Input [37] >> s = regex_match(str, patstr)
s =
? 1x3 string
??? "CN2018_BEIJING"??? "2018"??? "BEIJING"
Input [38] >> patstr = "(CN)(\\d*)_([A-Z]*)";
Input [39] >> s = regex_match(str, patstr)
s =
? 1x4 string
??? "CN2018_BEIJING"??? "CN"??? "2018"??? "BEIJING"
Input [40] >> str = "2668418"
str =
? 1x1 string
??? "2668418"
Input [41] >> patstr = "[1-9]\\d{4,11}" %第一位數(shù)字不能為0,后面是4-11個數(shù)字
patstr =
? 1x1 string
??? "[1-9]\d{4,11}"
Input [42] >> s = regex_match(str, patstr)
s =
? 1x1 string
??? "2668418"
Input [59] >> str = "<xml>value</xml>"
str =
? 1x1 string
??? "<xml>value</xml>"
Input [60] >> patstr = "<(.*)>(.*)</.*>";
Input [61] >> s = regex_match(str, patstr)
s =
? 1x3 string
??? "<xml>value</xml>"??? "xml"??? "value"

還有正則表達式的替換
Input [46] >> help regex_replace

正則表達式替換
語法 替換后的字符串 = regex_replace(str, 要被替換的子串的pattern, 用這個pattern替換)
例:
Input [6] >>? 替換后的字符串 = regex_replace("CN2018", "\\d{4}", "")
替換后的字符串 =
? 1x2 char
??? 'CN'
替換后的字符串 = regex_replace("CN2018", "([A-Z]{2})(\\d{4})", "$1_$2")
替換后的字符串 =
? 1x7 char
??? 'CN_2018'
Input [18] >>? 替換后的字符串 = regex_replace("我的中國CN2018", "[u4e00-u9fa5]*([A-Z]{2})(\\d{4})", "$1_$2")
替換后的字符串 =
? 1x19 char
??? '我的中國CN_2018'
Input [19] >>? 替換后的字符串 = regex_replace("我的中國CN2018", "([u4e00-u9fa5]*)([A-Z]{2})(\\d{4})", "$1_$2")
替換后的字符串 =
? 1x15 char
??? '我的中國_CN'
Input [20] >>? 替換后的字符串 = regex_replace("CN2018", "([u4e00-u9fa5]*)([A-Z]{2})(\\d{4})", "$1_$2")
替換后的字符串 =
? 1x3 char
??? '_CN'
Input [21] >>? 替換后的字符串 = regex_replace("CN2018", "([u4e00-u9fa5]+)([A-Z]{2})(\\d{4})", "$1_$2")
替換后的字符串 =
? 1x6 char
??? 'CN2018'



下面列出一些基本的正則表達式元字符(metacharacter):

. :匹配任何字符(除了換行符)。
[...] :這里的...換成具體的字符,表示可以匹配的單個字符。例如,[am] 將匹配 "a" 或 "m"。
[^...] :這里的...換成具體的字符, 表示不匹配此字符集中的任何字符。
???????? 例如,[^am] 將匹配除了 "a" 和 "m" 之外的任何字符。
[^] :表示可以匹配除了換行符之外的任何字符。
\d :匹配任何十進制數(shù)字(相當于 [0-9])。
\D :匹配任何非數(shù)字字符(相當于 [^0-9])。
\s :匹配任何空白字符(相當于 [ \t\n\r\f\v]), 這里\t表示tab,\n表示換行符,\r表示回車。
\S :匹配任何非空白字符(相當于 [^ \t\n\r\f\v])。
\w :匹配任何字母數(shù)字字符(相當于 [a-zA-Z0-9_])。
\W :匹配任何非字母數(shù)字字符(相當于 [^a-zA-Z0-9_])。
此外,正則表達式還支持一些修飾符,例如:

? :表示前面的元素是可選的,可以出現(xiàn)零次或一次。
+ :表示前面的元素是必須的,可以出現(xiàn)一次或多次。
{n} :表示前面的元素必須出現(xiàn) n 次。
{n,} :表示前面的元素可以出現(xiàn) n 次或更多次。
{n,m} :表示前面的元素可以出現(xiàn) n 到 m 次。
這些只是正則表達式的基礎(chǔ)知識,實際上正則表達式的能力遠不止這些。例如,它還可以用來處理更復雜的模式,如捕獲組、后向引用、條件等。



正則表達式 以及 北太天元的regex插件對正則字符串的支持的評論 (共 條)

分享到微博請遵守國家法律
吉林省| 南陵县| 芮城县| 奈曼旗| 浪卡子县| 庐江县| 贺兰县| 库伦旗| 西峡县| 枣强县| 开远市| 鸡西市| 嘉峪关市| 福海县| 武威市| 广灵县| 抚顺县| 常山县| 汶上县| 南部县| 浦江县| 平罗县| 德昌县| 扎兰屯市| 梁山县| 镇江市| 开江县| 徐汇区| 泽普县| 台前县| 高淳县| 澄迈县| 青州市| 桃江县| 牟定县| 镇沅| 遂平县| 阳新县| 青浦区| 宜兴市| 桐乡市|