欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

指南- 正則表達式

這里是一個短小的指南, 意在解開 StringRegExp() 函數(shù)的奧秘.

StringRegExp( "字符串", "正則表達式" [, 標志 ] )

"字符串" = 用于搜索匹配項的字符串.


"正則表達式" = 某些關鍵字組成的字符串, 可以讓該函數(shù)知道該字符串中有您要匹配的字符.
匹配狀態(tài)可能是:沒有, 可能有, 部分匹配或不匹配.


"標志" [可選參數(shù)] = 如果“正則表達式”發(fā)現(xiàn)你的 "字符串" 中有指定的字符串后,
你可以指定是返回第一個匹配, 還是返回所有匹配.

基本概念

你可能已經(jīng)理解, "正則表達式" 的書寫是調用 StringRegExp()(以下將這個函數(shù)縮寫為:SRE)惟一困難的部分.

"正則表達式" 是一個信息串, 用來告訴函數(shù)需要匹配那些字符.

要找特定的字符有可以不同的方法: 如果你想查找字符串"test", 這應該是很簡單的. 您告訴 SRE 先搜索 "t".

如果能找到, 則假定是匹配的, 而"正則表達式" 的另外部分則證明有什么發(fā)現(xiàn)是不匹配的.

因此, 如果 SRE 的下一個查找是 “e”, 則它仍然是一個匹配.

又例如 SRE 的下一個查找是 "x". SRE 立即知道它有沒有找到匹配, 因為你提供的"字符串"的第三個字符是 "s".
 

示例 1

MsgBox(0, "SRE 示例 1 的結果", StringRegExp("text", 'test'))

在這個例子中, 消息框應該返回 "0", 表示正則表達式 "test" 沒有在字符串 "text" 找到匹配.

我(作者,下同)知道這看起來很簡單, 但現(xiàn)在你知道它為什么沒有被發(fā)現(xiàn)嗎?.

指定正則表達式下一個方法是使用一個置位 ("[ ... ]"). 你可以把這個置位看成邏輯函數(shù) "OR".

讓我們使用前面的示例. 我們來查找字符串 "test" 或 "text".

我開始尋找一種正則表達式, 讓 SRE 會認為: 要匹配的第一個字符是 "t", 然后是 "e", 這對于想要匹配的兩個字符串是相同的.

現(xiàn)在, 我們要匹配 "s" OR(或) "x", 我們使用一個置位作為替換: "[sx]" 表示允許匹配 "s" 或 "x". 然后是最后一個字母 "t" 了.

示例 2

MsgBox(0, "SRE 示例 2 的結果", StringRegExp("text", 'te[sx]t'))
MsgBox(0, "SRE 示例 2 的結果", StringRegExp("test", 'te[sx]t'))

這兩個結果都應該返回 "1", 因為這時的正則表達式都匹配"test" 與 "text".

你也也用指定次數(shù)的方式匹配每個字符, 使用"{匹配的次數(shù)}"或指定一個范圍 "{最小,最大}".

下面的第一個例子是多余的, 但顯示我想要說明的意思:

示例 3

MsgBox(0, "SRE 示例 3 的結果", StringRegExp("text", 't{1}e{1}[sx]{1}t{1}'))
MsgBox(0, "SRE 示例 3 的結果", StringRegExp("aaaabbbbcccc", 'b{4}'))

較復雜的概念

你可能在想:"這個 StringInStr() 函數(shù)不是很有趣嗎?". 好吧, 使用一個值為 0 的 "標志".

大部份時間你是對的. 但 SRE 不止于此,它要強大得多.

隨著你使用 SRE 越來越多時,你會發(fā)現(xiàn)找尋可用的正則表達式結構卻越來越少.

你想要在正則表達式中指定每個具體字符的可用方法也越來越少.

例如, 一個游戲的紀錄日志有一行: "Gnarly Monster hits you for 18 damage."(多疤怪物對您有 18 次打擊.")

假定你想要知道多疤怪物打擊你的次數(shù). 好吧, 你不能使用 StringInStr(), 因為你不是要找尋 "18", 您應該查找 "????", 這里的 “?” 允許任意數(shù)字.

下面看我如何組合這個正則表達式. 告訴你怎么做和如何查找你想要尋找的:
1 ) 你應該知道, 它永遠包含的只是數(shù)字.
2 ) 你應該知道, 它有時會是 2 個字符長度.
2a) 你應該知道, 游戲中怪物能做的最大傷害值是 999.
2b) 你應該知道, 游戲中怪物能做的最低傷害值是 0.
3 ) 你應該知道, 它的長度總是在 1 到 3 個字符之間.
4 ) 你應該知道, 字符串中沒有其它數(shù)字

此時, 我想要介紹值為 1 的 標志和分組符號"()".

標志 "1" 能讓 SRE 不僅匹配您的正則表達式, 而且還返回一個數(shù)組, 同時捕捉數(shù)組元素組成的“組”字符.

我沒有離開本節(jié)指南離題太遠吧!舉這個例子:

示例 4

$asResult = StringRegExp("This is a test example", '(test)', 1)
If @error == 0 Then
    MsgBox(0, "SRE 示例 4 的結果", $asResult[0])
EndIf
$asResult = StringRegExp("This is a test example", '(te)(st)', 1)
If @error == 0 Then
    MsgBox(0, "SRE 示例 4 的結果", $asResult[0] & "," & $asResult[1])
EndIf

 

首先, 正則表達式必須匹配字符串 的某些字符串. 如果是的話, 然后告訴 SRE "捕捉"部分字符 ("()"), 并儲存在返回數(shù)組中.

您可以使用多種捕捉,這表現(xiàn)在示例4的第二項代碼中

好了, 回到多疤怪物游戲. 現(xiàn)在我們知道了該如何“捕捉”文字, 讓我們構建我們的正則表達式:

既然你知道你所要查找的是數(shù)字, 有 3 種可以指定“匹配任意數(shù)字” 的方法: "[:digit:]", "[0-9]", 與 "\d".

第一個或許是最容易理解的. 有一些類 (digit, alnum, space, 等等. 相關信息查看幫助文件中 “StringRegExp” 的完整列表) 你可以使用指定的字符集, 其中之一就是“digit”.

"[0-9]"只是規(guī)定了數(shù)字的范圍從 0 到 9.

"\d"僅僅是一個特殊字符, 它意味著前兩個相同.

3 個方法之間沒有差別, 并且所有的 SRE 通常至少有一對方法可以構建任何的正則表達式.

因為首先我們知道,我們想捕捉的是數(shù)字, 我們用圓括號 "(" 開始.

下一步, 我們要捕捉的數(shù)字長度介于1到3個字符之間, 并且全部是數(shù)字, 所以我們的正則表達式現(xiàn)在看起來像 "([0-9]{1,3}".

最后我們以反圓括號 ")" 結束我們的組: "([0-9]{1,3})". 讓我們試試:

示例 5

$asResult = StringRegExp("Gnarly Monster hits you for 18 damage.", _
                               '([0-9]{1,3})', 1)
If @error == 0 Then
    MsgBox(0, "SRE 示例 5 的結果", $asResult[0])
EndIf

 

你去哪里了? 消息框現(xiàn)在正確顯示了 "18".

下一步, 我們需要包括非捕捉組. 你可以使用 "(?:" 而不是 "(".

比方說, 您的日志說: "You deflect 36 of Gnarly Monster's 279 damage."

現(xiàn)在如果你在這里運行 SRE 示例 5, 你將會發(fā)現(xiàn)返回的是 "36" 而不是 "279".

現(xiàn)在我想在這里做的就是確定那些數(shù)字有些什么不同.

我們看第二個數(shù)字279,它后面跟隨一個空格, 然后才是單詞"damage".

我們可以只修改前面的正則表達式為 "([0-9]{1,3} damage)",

但是, 如果我們的腳本只是尋找 "damage" 的總數(shù),并且不知道 " damage" 何時結束?

此時, 您可以使用非捕獲組, 以實現(xiàn)這一目標.

示例 6

$asResult = StringRegExp("You deflect 36 of Gnarly Monster's 279 damage.", '([0-9]{1,3})(?: damage)', 1)
If @error == 0 Then
    MsgBox(0, "SRE 示例 6 的結果", $asResult[0])
EndIf

 

這篇指南可能太長了, 但主要是我想奠定個基礎. 要了解正則表達式如何工作, 主要看 SRE 如何“認為” .幾件事要記住:
- 請記住正則表達式每次傳送一個字符
- StringRegExp() 函數(shù)在找到正則表達式的第一個字符后, 那么您的工作就是提供足夠的證據(jù)“證明”它是否是真正的匹配. 示例6就很好的顯示了這一點.
- 記住 [ ... ] "OR"的用法 ([xyz] 匹配一個 "x", 一個 "y", 或一個 "z")

如果您還有任何其他問題, 首先請閱讀幫助文件的“StringRegExp”! 它詳細說明了 SRE 的所有細節(jié)和語法. 尤其是 "重復字符" 區(qū)段.

它能通過為范圍替換特定的字符, 使您的 "表達式" 更容易閱讀. 例如: "*" 相當于 {0,} 或從 0 到任意數(shù)量的字符

祝你好運, 正則表達式可以大大減少您的代碼長度, 而且使稍后的修改更容易. 歡迎校正和反饋!

資源


Wikipedia Article - Regular Expressions - 感謝 blindwig.

The 30 Minute Regex Tutorial - by Jim Hollenhorst.


GUI StringRegExp() 測試各類正則表達式 - 感謝 steve8tch. 榮譽修改: w0uter

 

維基百科 - 正則表達式 - 感謝 me.呵呵(這個是中文的)

pconline.com.cn - 正則表達式 (中文)

 

 

感謝 neogia 制作這個指南.

 

provider with jb51.net (unicode)