個人的理解子界類型更適合用于范圍的定義, 例如,人的年齡一般為1到120歲,一年中的月數為1到12月,一月中的天數為1到31天等等。
如果能在程序中對所用的變量的值域作具體規定,就便于檢查出那些不合法的數據,這就能更好地保證程序運行的正確性且在一定程度上節省內存空間。
子界類型能很好解決上面的問題。其實在數組的定義中,常用到子界類型,以規定數組下標的范圍。
這是Delphi特有的一種數據類型,至少在我的認知中其它語言是沒有的
type
子界類型標識符=常量1..常量2
常量1稱為子界的下界,常量2稱為子界的上界;所謂的上界也就是開始的邊界,而下界就是結束的邊界
注意事項:
下界和上界必須是同一順序類型(該類型稱為子界類型的基類型),且上界的序號必須大于下界的序號。 例如
type
age=1..100;
letter='a' ..'z';
當然了,類似于前面提到的枚舉類型,它也可以把類型聲明和變量聲明并為一步??梢灾苯釉谧兞空f明中定義子界類型。
type
letter='a'..' z ';
var
ch1,ch2:letter;
可以合并成:
var
ch1,ch2:'a'..'d';
凡可使用基類型的運算規則同樣適用該類型的子界類型。例如,可以使用整型變量的地方,也可以使用以整型為基類型的子界類型數據。對基類型的運算規則同樣適用于該類型的子界類型。例如,div,mod要求參加運算的數據為整, 因而也可以為整型的任何子界類型數據?;愋拖嗤牟煌咏珙愋蛿祿梢赃M行混合運算。例如:設有如下說明:
var x:1..100;
y:1..500;
z:1..1000;
a:integer;
合法語句:a:=Sqr(x)+y+z; z:=x+y
y:=x+z+a; 當x+y+a的值在1~500范圍內時是合法的,否則會出錯。
例1、判斷當前是周幾(case語句盡量少用)
文為 AI 研習社編譯的技術博客,原標題 :
Regex tutorial — A quick cheatsheet by examples
翻譯 | kerr、狒狒 校對 | 就2 整理 | 就2
原文鏈接:
https://medium.com/factory-mind/regex-tutorial-a-simple-cheatsheet-by-examples-649dc1c3f285
正則表達式(regex 或 regexp)在文本信息提取方面是非常有用的工具,通過查詢一個或多個特定搜索模式的匹配實現(例如,特定的ASCII或unicode字符序列)。
正則表達式的應用領域包括字符串語義分析/替換,到數據格式轉換,以及網頁抓取等。
最有趣的一點是,只要學過正則表達式的語法,在目前幾乎所有編程語言中都可以應用正則表達式(JavaScript、Java、VB、C/C++、C#、Python、Perl、Ruby、Delphi、R、Tcl、以及其他很多語言),這些語言對一些高級功能和語法的支持只有細微的區別。
下面通過一些示例和解釋來了解正則表達式。
^The matches any string that starts with The -> Try it!end$ matches a string that ends with end
^The end$ exact string match (starts and ends with The end)
roar matches any string that has the text roar in it
數量詞 —* + ? and{}
abc* | 匹配ab后有零個或多個為c的字符串 |
abc+ | 匹配ab后有一個或多個為c的字符串 |
abc? | 匹配ab后有零個或一個為c的字符串 |
abc{2} | 匹配ab后有2個 c的字符串 |
abc{2,} | 匹配ab后有2個 c或更多個c的字符串 |
abc{2,5} | 匹配ab后跟2到5個c的字符串 |
a(bc)* | 匹配a后面跟零個或多個重復的bc序列的字符串 |
a(bc){2,5} | 匹配a后面跟2個到5個重復的bc序列的字符串 |
或運算符——|或
a(b|c) | 匹配a后跟b或c的字符串 - >試試吧! |
a[bc] | 同上一情況 |
字符類——\d \w \s和.
\d | 匹配一個數字字符 - >試試吧! |
\w | 匹配單詞字符(字母、數字或下劃線) - >試試吧! |
\s | 匹配空白字符(包括制表符和換行符) |
. | 匹配任意字符 - >試試吧! |
謹慎使用“.” 運算符,因為通常類或反義字符類(我們將在下面介紹)會更快更精確。
\ d,\ w和\ s也分別用\ D,\ W和\ S表示它們的否定。
例如,\ D將執行與\ d獲得的相反匹配。
\D | 匹配一個非數字字符 - >試試吧! |
為了按字面意思理解,你必須使用反斜杠“\”來轉義字符^.[$|*+?{\,因為它們具有特殊含義。
$\d | 匹配一個數字前面有一個$的字符串 - >試試吧! |
請注意,您還可以匹配不可打印的字符,如制表符\ t,換行符\ n,回車符\ r。
標志位
基礎部分中,如何構建一個正則表達式還有一個基本概念:標志。
正則表達式通常以這種形式/abc /出現,其中搜索模式由兩個斜杠字符/分隔。
我們可以指定一個帶有這些值的標志(我們也可以將它們相互組合):
g(全局)在第一次匹配后不返回,從上一次匹配結束時重新開始后續搜索
m(多行)啟用時,^和$將匹配這行的開頭和結尾,而不是整個字符串。
i(不敏感)使整個表達式不區分大小寫(例如/ aBc / i將匹配AbC)。
a(bc) | 括號創建一個值為bc的捕獲組 - >試試吧! |
a(?:bc)* | 我們使用?:禁用捕獲組 - >試試吧! |
a(? | 我們使用? |
當我們需要使用您首選的編程語言從字符串或數據中提取信息時,此運算符非常有用。由幾個組捕獲的任何多次出現都將以經典數組的形式公開:我們將使用匹配結果的索引來訪問它們的值。
如果我們選擇為組添加名稱(使用(?
[abc] | 匹配一個具有a或b或c的字符串 - >與a | b | c相同 - >試試吧! |
[a-c] | 同上一情況 |
[a-fA-F0-9] | 表示一個十六進制數字的字符串,不區分大小寫 - >試試吧! |
[0-9]% | 在%符號之前具有0到9之間字符的字符串 |
[^a-zA-Z] | 一個沒有字母從A到Z或從A到Z.的字符串,在這種情況下,^被用作表達式的否定->嘗試它! |
請記住,在括號內的表達式中,所有特殊字符(包括反斜杠\)都會失去其特殊權力:因此我們不會應用“轉義規則”。
量詞(* + {} )是貪婪的運算符,因此它們通過提供的文本盡可能地擴展匹配。
例如,
simple div
test中的simple div
。為了只捕獲div標簽,我們可以使用? 讓它變得懶惰:
匹配內包含的任何一個或多個字符,根據需要進行擴展 - >試試吧!
請注意,更好的解決方案應該避免使用.來支持更嚴格的正則表達式:
]+> | 匹配中包含的一次或多次除以外的任何字符 - >試試吧! |
邊界— \b and \B
\babc\b | 執行“僅限整個單詞”搜索 - >嘗試一下! |
\b表示像插入符號(它類似于$和^)的匹配位置,其中一側是單詞字符(如\w)而另一側不是單詞字符(例如,它可能是字符串的開頭或者空格字符)。
它伴隨著它的否定,\B。這匹配\b不匹配的所有位置,如果我們想要找到完全被單詞字符包圍的搜索模式,則可以匹配。
\Babc\B | 僅當圖案完全被單詞字符包圍時才匹配 - >試試吧! |
回溯引用——
([abc]) | 使用,它與第一個捕獲組匹配的相同文本匹配 - >試試吧! |
([abc])([de]) | 我們可以使用\ 2(\ 3,\ 4等)來識別與第二個(第三個,第四個等)捕獲組匹配的相同文本 - >試試吧! |
(? | 我們把這個組命名為foo,稍后我們引用它(\ k |
先行和后行斷言——(?=)和(?
d(?=r) | 僅在r之后匹配d,但r將不是整體正則表達式匹配的一部分->試試吧! |
(? | 僅在r之前匹配d,但r將不是整體正則表達式匹配的一部分->試試吧! |
你也可以使用否定運算符!
d(?!r) | 僅在不跟隨r的情況下匹配d,但r將不是整體正則表達式匹配的一部分->嘗試它! |
(? | 僅在沒有r之前匹配d,但r將不是整體正則表達式匹配的一部分->嘗試它! |
正如您所看到的,正則表達式的應用程序字段可以是多個的,我確信您在開發人員職業生涯中看到的任務中至少識別出這些任務中的一個,這里是一個快速列表:
數據驗證(例如檢查時間字符串是否格式正確)
數據抓?。ㄌ貏e是網頁抓取,最終按特定順序查找包含特定單詞集的所有頁面)
數據轉換(將數據從“原始”轉換為另一種格式)
字符串解析(例如捕獲所有URL的GET參數,捕獲一組括號內的文本)
字符串替換(即使在使用通用IDE的代碼會話期間,例如在相應的JSON對象中轉換Java或C#類 - 將“;”替換為“,”將其設為小寫,避免類型聲明等)
語法高亮,文件重命名,數據包嗅探和許多其他涉及字符串的應用程序(其中數據不必是文本)
如果你喜歡的話,不要忘了推薦這篇文章。
不久我將出版一份包含常見正則表達式列表的新文章,敬請關注!雷鋒網雷鋒網雷鋒網
ueJS調用本地Delphi應用程序本質上與 js 調用本地 exe 程序的原理是相同的。通用的做法是通過在 Windows 注冊表中注冊自定義URL Protocol 協議,然后通過瀏覽器執行打開對應的協議即可。
Delphi 窗體應用程序接受 1 個來自網絡調用的參數,并將參數值顯示在界面上。
第一步,先創建窗體應用程序,在窗體應用程序中放置一個 Label,其 Caption 屬性值為“Web傳入的參數”,一個 Edit 控件,其 name 屬性值為 Edit1;
第二步,編寫窗體的 OnCreate 事件,代碼如下:
procedure TForm1.FormCreate(Sender: TObject);
begin
// 檢查命令行參數是否為1,不為1則終止程序的執行
if Application.ParamCount <> 1 then
begin
ShowMessage('參數錯誤, 格式:democalledbyvue <參數1>');
Application.Terminate;
end;
// 將命令行參數值顯示在窗體的 Edit1 控件中
Edit1.Text:=TIdURI.URLDecode(Application.Params[1]);
end;
URL解碼采用了 indy 包中的 TIdURI 類的 URLDecode 方法。
自定義URL Protocol 協議模板:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\<協議名稱>]
@="URL:<協議名稱> Protocol Handler"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\<協議名稱>\DefaultIcon]
@="<可執行程序>"
[HKEY_CLASSES_ROOT\<協議名稱>\shell]
@=""
[HKEY_CLASSES_ROOT\<協議名稱>\shell\open]
@=""
[HKEY_CLASSES_ROOT\<協議名稱>\shell\open\command]
@="\"<可執行程序>\" \"%1\""
將模板文件中的 <協議名稱> 和 <可執行程序> 替換為實際名稱即可。注:<可執行程序> 為可執行程序文件的全路徑名稱,其中的路徑分隔符 “\” 必須轉義,寫作 “\”。
將模板文件保存為 .reg ,雙擊運行。
示例:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\democalledbyvue]
@="URL:democalledbyvue Protocol Handler"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\democalledbyvue\DefaultIcon]
@="E:\\workspace_of_codetyphon\\democalledbyvue\\democalledbyvue.exe"
[HKEY_CLASSES_ROOT\democalledbyvue\shell]
@=""
[HKEY_CLASSES_ROOT\democalledbyvue\shell\open]
@=""
[HKEY_CLASSES_ROOT\democalledbyvue\shell\open\command]
@="\"E:\\workspace_of_codetyphon\\democalledbyvue\\democalledbyvue.exe\" \"%1\""
在 Vue 創建的項目中的頁面上添加一個鏈接、一個文本框、一個按鈕控件,實現點擊鏈接后調用 3.1 中創建的應用程序并傳遞固定的參數,在文本框中輸入文本,單擊按鈕調用 3.1 中創建的應用程序并傳遞文本框中輸入的內容,代碼如下:
<template>
<div style="padding: 24px;">
<a href="democalledbyvue://這是從Web傳遞的參數/11570d2c987ef23a609e" >調用本地exe</a>
<div style="padding: 12px;">
<InputText type="text" v-model="param" />
</div>
<Button label="調用本地exe" @click="call_local_exe"/>
</div>
</template>
<script>
import {ref} from "vue"
import Button from 'primevue/button'
import InputText from 'primevue/inputtext'
export default {
name: "IndexPage",
components: {
Button,
InputText,
},
setup () {
const param=ref('')
function call_local_exe () {
window.open('democalledbyvue://' + param.value)
}
return {
param, call_local_exe
}
}
}
</script>
<style scoped>
</style>
在 js 中關鍵就是通過自定義協議 democalledbyvue:// 來調用。
Web 頁面:
本地應用程序:
從執行結果我們可以看出,每次調用都會打開以一個本地應用程序的實例。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。