HALCON数据结构之字符串

devtools/2024/10/19 19:27:55/

1.1 String字符串的基本操作

*将数字转换为字符串或修改字符串
*tuple_string (T, Format, String) //HALCON语句
*String:= T $ Format  //赋值操作*Format string 由以下四个部分组成:
*<flags><field width>.<precision><conversion 字符>*1. flags 标志*1.1 字符'-'
*转换的结果是在字段中左对齐。*1.2 字符'+'*带符号转换的结果总是以符号'+'或'-'开头。*1.3 <space>*如果带符号转换的第一个字符不是符号,则在结果前面加一个空格字符。
*这意味着如果空格标志和+标志同时出现,则忽略空格标志。* 1.4 '#'*该被转换为“替代形式”。对于d和s转换,此标志不起作用。* 1.5 '0'*该值应该是零填充。对于d、o、u、x、x、e、e、f、f、g和g转换,转换后的值在左侧用零填充,而不是空白。如果同时出现0和-标志,则忽略0标志。如果用数字转换(d、o、u、x和x)给出精度,则忽略0标志。* 2. field width*一个可选的十进制数字字符串,用于指定最小字段宽度。*对于输出字段,如果转换值的字符少于字段宽度,则在字段宽度的左侧填充(如果给出了左侧调整标志-,则在右侧填充)。* 3. precision*指定d、o、x或x转换时出现的最小位数(该字段用前导零填充),e和f转换时出现在基数字符之后的位数,g转换时有效位数的最大数目,或s转换时从字符串打印的最大字符数。* 4. conversion characters*转换字符表示要应用的转换类型* 4.1 d,u,o,x,X*整数参数以有符号十进制(d)、无符号十进制(u)、无符号八进制(o)或无符号十六进制(x和x)的形式打印。x转换使用数字和字母0123456789abcdef, x转换使用数字和字母0123456789ABCDEF。* 4.2 f*浮点数参数以[-]dddrddd格式的十进制形式打印,其中基数字符r后面的位数等于精度规范。
*如果从参数中省略精度,则输出六位数字;如果精度显式为0,则不显示基数。* 4.3 e,E*浮点数参数以[-]drdddepmdd格式打印,其中基数字符前面有一位数字,后面的位数等于精度。
* 4.4 g,G*浮点数参数以f格式打印(对于G转换字符,则以e格式打印),精度指定有效数字的个数。
* 4.5 s*参数被视为一个字符串,字符串中的字符将被打印,直到字符串的末尾或达到参数的精度规范所指示的字符数。* 4.6 b*类似于s转换说明符,不同之处是字符串可以包含反斜杠转义序列,然后将其转换为它们所表示的字符。*示例1:将数字转换为字符串
*
* '     23.00'
tuple_string (23, '10.2f', String)
String := 23$'10.2f'
*
* '23.00     '
tuple_string (23, '-10.2f', String)
String := 23$'-10.2f'
*
* '4.0000000'
tuple_string (4, '.7f', String)
String := 4$'.7f'
*
* ' +1234.568'
tuple_string (1234.56789, '+10.3f', String)
String := 1234.56789$'+10.3f'
*
* 'ff'
tuple_string (255, 'x', String)
String := 255$'x'
*
* 'FF'
tuple_string (255, 'X', String)
String := 255$'X'
*
* '00255'
tuple_string (0xff, '.5d', String)
String := 0xff$'.5d'*示例2:修改字符串
*
* '     total'
tuple_string ('total', '10s', String)
String := 'total'$'10s'
*
* 'total     '
tuple_string ('total', '-10s', String)
String := 'total'$'-10s'
*
* 'tot       '
tuple_string ('total', '-10.3s', String)
String := 'total'$'-10.3s'*示例3:将整数按格式转换为字符串d1 := 12345$'#o'  //8进制,0为前缀
d2 := 12345$'#x'  //16进制,0x为前缀,3039为赋值
d3 := 12345$'#X'  //16进制,0X为前缀,3039为赋值
d4 := 12345$'#f'  //double型,默认保留小数点后六位d5 := 12345$'#g'  //使数字始终保持六位,不足补零
d6 := 12345$'#G'  //使数字始终保持六位,不足补零
d7 := 12345$'#e'  //转换成科学计数
d8 := 12345$'#E'  //转换成科学计数d9 := 12345$'6'   //小于六位时,文本右对齐,大于不影响
d10 := 12345$'-6'  //小于六位时,文本左对齐,大于不影响
d11 := 12345$'.6'  //小于六位时,在左边补零,大于不影响
d12 := 12345$'10.5'  //小于10位时,文本右对齐;小于5位则在左边补零,大于不影响*示例4:修改字符串
s1 := 'HALCON'$'10'      //文本右对齐
s2 := 'HALCON'$'-10'     //文本左对齐

1.2 String字符串的转换

*1、将一个元组转换为字符串元组tuple_string ([1,2,3,4.0,5.0,6.0], '.3f', String1)
String1:= [1,2,3,4.0,5.0,6.0] $ '.1f'*2、检查元组中的元素(整数、实数和字符串)是否表示数字tuple_is_number (String1, IsNumber1)
IsNumber1:=is_number(String1)*3、将输入元组转换为数字元组tuple_number (String1, Number1)
Number1:=number(String1)*4、将元组中长度为1的字符串元素转换为它们相应的ASCII元组String2:=['1', '2', '3', '4', '5', '6']
tuple_ord (String2, Ord1)
Ord1:= ord(String2)*5、将一个字符串元组转换为对应的ASCII整数String3:=['1a', '2b', '3c', '4d', '5e', '6f']
tuple_ords (String3, Ords1)
Ords1:= ords(String3)*6、根据ASCII码将整型元组转换为字符元组(每个元素长度为1)tuple_chr (Ord1, Chr1)
Chr1:=chr(Ord1)*7、根据ASCII码将整型元组转换为字符元组tuple_chrt (Ords1, Chrt1)
Chrt1:=chrt(Ords1)

1.3 String字符串的分割

String1:='www.277.558.com'
String2:= ['alpha:1', 'beta:2', 'gamma:3'] *1、使用预定义的分隔符将字符串拆分为子字符串(分割字符在原字符串中被删除)tuple_split (String1, '.', Substrings1)
tuple_split (String2, ':', Substrings2)tuple_split (String2, 'a:', Substrings3)
tuple_split (String2, ':123', Substrings3)Substrings3:=split(String2, ':123')*2、从输入的字符串元组中截取出第0-n位置处的字符,并作为新的字符串元组返回tuple_str_first_n (String1,6 , Substring4)
tuple_str_first_n (String2,[0,1,2] , Substring5)
Substring5:=str_firstn(String2,[0,1,2])*3、从输入的字符串元组中截取出第n-最后位置处的字符,并作为新的字符串元组返回tuple_str_last_n (String1,6 , Substring6)
tuple_str_last_n (String2,[6,5,6] , Substring7)
Substring7:=str_lastn(String2,[6,5,6])

1.4 String字符串的搜索

String1:='www.111.www.277.558.com'
String2:= ['alpha:1', 'beta:2', 'gamma:3'] *1、获取字符串元组中每个字符串的长度tuple_strlen (String1, Length1)
tuple_strlen (String2, Length2)
Length2:=strlen(String2)*2、前向搜索字符串元组中的字符,并输出对应的位置*在输入元组的字符串元素中前向搜索输入元组ToFind的字符,并输出对应的位置tuple_strchr (String1,'w' , Position1)
tuple_strchr (String1,['2','5','c'] , Position2)tuple_strchr (String2,'a' , Position3)
tuple_strchr (String2,['1','2','3'] , Position4)Position4:=strchr(String2,['1','2','3'])*3、前向搜索字符串元组中的字符串,并输出对应的位置*在输入元组的字符串元素中前向搜索输入元组ToFind的字符串,并输出对应的位置tuple_strstr (String1,'277' , Position5)
tuple_strstr (String1,['www','257','588','com'] , Position6)tuple_strstr (String2,'a:' , Position7)
tuple_strstr (String2,['a:1','a:2','a:3'] , Position8)Position8:=strstr(String2,['a:1','a:2','a:3'])*4、后向搜索字符串元组中的字符,并输出对应的位置*在输入元组的字符串元素中后向搜索输入元组ToFind的字符,并输出对应的位置*后向搜索,即从最后一个字符到第一个字符检查每个字符串tuple_strrchr (String1,'w' , Position9)
tuple_strrchr (String1,['2','5','c'] , Position10)tuple_strrchr (String2,'a' , Position11)
tuple_strrchr (String2,['1','2','3'] , Position12)Position12:=strrchr(String2,['1','2','3'])*5、后向搜索字符串元组中的字符串,并输出对应的位置*在输入元组的字符串元素中后向搜索输入元组ToFind的字符串,并输出对应的位置*后向搜索,即从最后一个字符到第一个字符检查每个字符串tuple_strrstr (String1,'277' , Position13)
tuple_strrstr (String1,['www','257','588','com'] , Position14)tuple_strrstr (String2,'a:' , Position15)
tuple_strrstr (String2,['a:1','a:2','a:3'] , Position16)Position16:=strrstr(String2,['a:1','a:2','a:3'])

1.5 String字符串的正则表达式

1.5.1 测试字符串是否匹配正则表达式

*测试字符串是否匹配正则表达式
*tuple_regexp_test( : : Data, Expression : NumMatches)*允许ab重复3次
tuple_regexp_test ('ababab', '(ab){3}', NumMatches1)*允许ab重复3次
tuple_regexp_test ('abababa', '(ab){3}', NumMatches2)*开头匹配ab,结尾匹配ab,并且重复3次
tuple_regexp_test ('ababab', '^(ab){3}$', NumMatches3)*匹配失败
tuple_regexp_test ('abababa', '^(ab){3}$', NumMatches3)

1.5.2 使用正则表达式处理文件名

get_system ('image_dir', HalconImages)
get_system ('operating_system', OS)
if (OS{0:2} == 'Win')tuple_split (HalconImages, ';', HalconImagesSplit)
elsetuple_split (HalconImages, ':', HalconImagesSplit)
endif
list_files (HalconImagesSplit[0], ['files', 'follow_links'], Files)*选择后缀是png文件
tuple_regexp_select (Files, '\\.png$', FilesPNG)*删除所有以数字结尾的文件名
tuple_regexp_select (FilesPNG, ['\\d\\.png$', 'invert_match'], FilesNoDigit)*提取不带斜杠的文件名(剥离目录部分)
tuple_regexp_match (FilesNoDigit, '[^/\\\\]*.png', ShortNames)*转换文件名的后缀名
tuple_regexp_replace (ShortNames, '(.*)\\.png$', 'out_$1.jpg', ConvertedNames)*统计包含字符'-'或下划线的文件数量
tuple_regexp_test (ShortNames, '_|-', NumCombined)*再次统计以数字结尾的文明名的文件数量并计算百分比
if (|ShortNames| > 0)Result := 100.0 * regexp_test(ShortNames,'\\d') / |ShortNames| + '% of PNG file names contain a digit'
endif
* Return letters 2-n of all files starting with 'a'*选择以a为开头的元素['angio-part.png', 'atoms.png', 'autobahn.png']
Selection1 := regexp_select(ShortNames, '^a')
Match1:= regexp_match(Selection1,'^a(.*)')*返回所有以'a'开头的文件名中的第2-n个字母
Result := regexp_match(regexp_select(ShortNames,'^a'),'^a(.*)')* Data =~ Expression 是regexp_test的缩写,用于布尔表达式
if (ShortNames =~ '^z')Result := 'A filename starting with z exists'
endif

1.5.3 使用正则表达式提取子字符串

*使用正则表达式提取子字符串
*tuple_regexp_match( : : Data, Expression : Matches)* 正则表达式含义:* ^ 匹配字符串开头;
* $ 匹配字符串的结尾(允许尾部换行符);
* . 匹配除换行符以外的任何字符;
* [...] 匹配括号中列出的任何字符。如果第一个字符是'^',这将匹配除括号以内的其他任何字符。* * 允许前面的文字或组0次或者多次重复;
* + 允许1次或者多次重复;
* ? 允许0次或者1次重复;
* {n,m} 允许 n 到 m 次重复;
* {n}   只允许n次重复;                             * ( ) 对子模式进行分组,并创建一个捕获组;
* (?:)分组子模式而不创建捕获组;                            * \ 转义字符
* \d,\D   匹配一个数组
* \w,\W   匹配字母、数字或下划线
* \s,\S   匹配空白字符
* \b,\B   匹配单词边界                               * 正则表达式基础用法:*a、x*是从字符串开头开始匹配的,x*的第二次匹配是从第一次匹配到的字符串之后的子字符串开始匹配的;
*b、x(.*)提取的是x之后的子字符串;x1(.*)x2 :获取x1-x2之间的字符串;
*c、x.是从前向后查找,匹配的结果是'x'+'x的后一个字符'(x查找的位置不是最后一个字符);若x查找的位置是最后一个字符,则匹配的结果为''
*d、.x是从后向前查找,匹配的结果是'x的前一个字符'+'x'(x查找的位置不是第一个字符);若x查找的位置是第一个字符,则匹配的结果为''5*1、表达式 ^x * 提取开头的字符串'ab'
tuple_regexp_match ('12abba', '^12', Result1)*2、表达式 x  * 提取字符串'b'                               
tuple_regexp_match ('abba', 'b', Result2) *3、表达式 x$ * 提取结尾的字符串'a'                               
tuple_regexp_match ('abba5', '5$', Result3)                              *4、表达式 x** 提取字符串'a'
tuple_regexp_match ('abba', 'a*', Result4) * 提取字符串''
tuple_regexp_match ('abba', 'b*', Result5)  * 提取字符串'abb'
* 剩下的字符在剩余的字符串中匹配
tuple_regexp_match ('abba', 'ab*', Result6) * 字符'a'在字符串的第一个位置被匹配到
tuple_regexp_match ('abba', 'a', Result61)  //'a'* 字符'b*'在剩余字符串中再次查找
tuple_regexp_match ('bba', 'b*', Result62)  //'bb'* 提取字符串'b'  
tuple_regexp_match ('abba', 'ba*', Result7) *字符'b'在字符串的第二个位置被找到
tuple_regexp_match ('abba', 'b', Result71)    // 'b'*字符'a*'在剩余字符串中匹配再次查找
tuple_regexp_match ('ba', 'a*', Result72) // ''* 5、表达式 x1*x2** 提取字符串'abb'
tuple_regexp_match ('abba', 'a*b*', Result8) 
tuple_regexp_match ('abba', 'a*', Result81)  //'a'
tuple_regexp_match ('bba', 'b*', Result82)   //'bb'* 提取字符串'a'
tuple_regexp_match ('abba', 'b*a*', Result9)
tuple_regexp_match ('abba', 'b*', Result91) //''
tuple_regexp_match ('abba', 'a*', Result92) //'a'* 6、表达式 x1+x2** 提取字符串'bba'
tuple_regexp_match ('abba', 'b+a*', Result10)
tuple_regexp_match ('abba', 'b+', Result101) //'bb'
tuple_regexp_match ('a', 'a*', Result102)    //'a'*7、表达式 x.* 提取字符串'ab'
tuple_regexp_match ('abba', 'a.', Result111)* 提取字符串'bb'
tuple_regexp_match ('abba', 'b.', Result112)* 提取字符串'abb'
tuple_regexp_match ('abba', 'ab.', Result113)* 提取字符串''
tuple_regexp_match ('abba', 'ba.', Result114)*7、表达式 .x* 提取字符串'ba'
tuple_regexp_match ('abba', '.a', Result115)* 提取字符串'ab'
tuple_regexp_match ('abba', '.b', Result116)* 提取字符串''
tuple_regexp_match ('abba', '.ab', Result117)* 提取字符串'bba'
tuple_regexp_match ('abba', '.ba', Result118)*8、表达式[x]** 提取字符串'a'
tuple_regexp_match ('abba', '[a]*', Result121)* 提取字符串''
tuple_regexp_match ('abba', '[b]*', Result122)* 提取字符串'abba'
tuple_regexp_match ('abba', '[ab]*', Result123) * 提取字符串'abba'
tuple_regexp_match ('abba', '[ba]*', Result124)*9、表达式x(.*)* 提取字符串['mg123', 'mg124']
tuple_regexp_match (['img123','img124'], 'i(.*)', Result131)* 提取字符串['g123', 'g124']
tuple_regexp_match (['img123','img124'], 'im(.*)', Result132)* 提取字符串['123', '124']
tuple_regexp_match (['img123','img124'], 'img(.*)', Result133)* 提取字符串['23', '24']
tuple_regexp_match (['img123','img124'], 'img1(.*)', Result134)* 提取字符串['3', '4']
tuple_regexp_match (['img123','img124'], 'img12(.*)', Result135)* 提取字符串['', '']
tuple_regexp_match (['img123','img124'], 'img123(.*)', Result136)*10、表达式 x1(.*)x2 :获取x1-x2之间的字符串* 提取字符串['110', '111', '112']
tuple_regexp_match (['img110.bmp','img111.bmp','img112.bmp'], 'img(.*).bmp', Result137)*11、表达式 x(.*)\\.(.*) :以'.'为分割分组 x(.*)的结果* 提取字符串 ['001','bmp']
tuple_regexp_match ('mydir/img001.bmp', 'img(.*)\\.(.*)', Result14)

1.5.4 使用正则表达式替换子字符串

*使用正则表达式替换子字符串
*tuple_regexp_replace( : : Data, Expression, Replace : Result)*匹配失败,在字符串的前面添加'x'
tuple_regexp_replace ('abba', 'b*', 'x', Result1)*将第一个小'b' 替换为'x'
tuple_regexp_replace ('abba', 'b', 'x', Result2)  *将所有的小'b' 替换为'x'
tuple_regexp_replace ('abba', ['b', 'replace_all'], 'x', Result3) *替换为['outimg10.bmp.txt', 'outimg11.bmp.txt', 'outimg12.bmp.txt']
tuple_regexp_replace(['img10.bmp','img11.bmp','img12.bmp'], \'img(.*).bmp', 'out$0.txt', Result4)*替换为['out10.txt', 'out11.txt', 'out12.txt']
tuple_regexp_replace(['img10.bmp','img11.bmp','img12.bmp'], \'img(.*).bmp', 'out$1.txt', Result5)*替换为['out.txt', 'out.txt', 'out.txt']
tuple_regexp_replace(['img10.bmp','img11.bmp','img12.bmp'], \'img(.*).bmp', 'out$2.txt', Result6)*提取的字符串['1234567', '2345678', '3456789']
tuple_regexp_match (['SN/1234567-X', 'SN/2345678-Y', 'SN/3456789-Z'], 'SN/(\\d{7})-([A-Z])', Matches1)*替换为['Product Model X, Serial Number 1234567', 'Product Model Y, Serial Number 2345678', 'Product Model Z, Serial Number 3456789']
tuple_regexp_replace (['SN/1234567-X', 'SN/2345678-Y', 'SN/3456789-Z'], 'SN/(\\d{7})-([A-Z])', 'Product Model $2, Serial Number $1', Result7)*提取的字符串['01', '06']
tuple_regexp_match (['01/04/2000', '06/30/2007'], '(\\d{2})/(\\d{2})/(\\d{4})', Matches2)
tuple_regexp_replace (['01/04/2000', '06/30/2007'], '(\\d{2})/(\\d{2})/(\\d{4})', 'Day: $2, Month: $1, Year: $3', Result8)

1.5.5 选择匹配正则表达式的元组元素

*选择匹配正则表达式的元组元素
*tuple_regexp_select( : : Data, Expression : Selection)get_system ('image_dir', HalconImages)
get_system ('operating_system', OS)
if (OS{0:2} == 'Win')tuple_split (HalconImages, ';', HalconImagesSplit)
elsetuple_split (HalconImages, ':', HalconImagesSplit)
endiflist_files (HalconImagesSplit[0], ['files', 'follow_links'], Files)*返回所有不包含字符串'pcb'的文件名
tuple_regexp_select (Files, ['pcb','invert_match'], Result2)*返回元组元素 ['a.png','c.bmp']
tuple_regexp_select (['.','..','mydir','a.png','b.txt','c.bmp','d.dat'], \'.(bmp|png)', Result1)

http://www.ppmy.cn/devtools/127087.html

相关文章

5G智能终端:低空经济崛起的隐形翅膀!

随着5G技术的快速发展&#xff0c;低空经济正迎来前所未有的发展机遇。5G智能终端在这一领域的应用&#xff0c;不仅极大地提升了操作体验&#xff0c;还为多个行业带来了革命性的变革。在无人机领域&#xff0c;传统的遥控器正逐渐被手机或平板遥控所取代&#xff0c;这些设备…

鸿蒙Next设备上的ProxyMan、Charles网络抓包配置教程

一、Proxyman配置 1. 导出证书 ProxyMan菜单栏依次点击 证书—>导出—>根证书为PEM 然后保存.pem文件传送(如hdc命令<下文会有介绍>)至鸿蒙Next设备存储任意位置 2. 安装证书 系统设置搜索“证书”&#xff0c;结果列表中点击“证书与凭据” 点击“从存储设备…

【VUE3】子组件中的el-upload 选择图片点击取消 会触发父组件emit cancel方法

源代码如下&#xff1a; <createOriginalitycancel"cancelCreate"></createOriginality> 问题是&#xff1a;每次上传图片点击取消 总会触发cancelCreate方法 经反复测试 发现问题应该是el-upload 点击取消的时候触发了我的组件的cancel方法 解决方式…

浅谈C++之MBus通信

在C中实现MBus通信&#xff0c;您通常需要使用特定的库来处理MBus协议的细节。以下是一些关键步骤和示例代码&#xff0c;帮助您开始使用C进行MBus通信。 1. 选择合适的库 对于C&#xff0c;您可以选择使用FieldTalk Modbus Master C Library&#xff0c;这是一个功能丰富的库…

Linux历史

Linux 于 1991 年由芬兰学生 Linus Torvalds 作为个人项目开始&#xff0c;旨在创建一个新的免费操作系统内核。在其历史发展中&#xff0c;Linux 内核经历了持续的增长。自 1991 年首次发布源代码以来&#xff0c;Linux 内核从少量的 C 语言文件&#xff0c;且受限于禁止商业发…

【AI整合包及教程】EchoMimic:开创数字人新时代,让静态图像“活”起来!

在数字化浪潮的推动下&#xff0c;人工智能技术正以前所未有的速度渗透到我们生活的方方面面。从智能家居到自动驾驶&#xff0c;从智能客服到医疗诊断&#xff0c;AI的触角无处不在。而如今&#xff0c;阿里巴巴旗下的蚂蚁集团再次引领潮流&#xff0c;宣布开源其革命性的数字…

中间件详解与应用场景

1. 引言 随着信息技术的飞速发展&#xff0c;应用系统变得日益复杂&#xff0c;软件架构逐步从单体应用演变为分布式系统。在这种复杂的环境中&#xff0c;如何使各个系统、服务和组件之间顺畅地通信、协作&#xff0c;成为了软件开发中的关键问题。中间件&#xff08;Middlew…

MySQL数据库中存储图片和读取图片的操作

文章目录 方法一&#xff1a;将图片以 BLOB 类型存储在数据库中MySQL 语句实现Python 实现 方法二&#xff1a;将图片存储在文件系统中&#xff0c;并在数据库中存储路径MySQL 语句实现Python 实现 总结 在MySQL数据库中存储图片通常有两种主要方式&#xff1a;将图片以二进制数…