wwb007 发表于 2012-7-5 17:28:55

不同语言对字符串的处理

本帖最后由 wwb007 于 2012-7-5 09:38 编辑

网上有人整理过Shell和PowerShell常用字符串处理方式,希望高手能给出AutoIT的处理方式,原文如下:

1. 我们来看Shell中求字符串长度的例子:%x="abcd"
#方法一
%exprlength$x
4
# 方法二
%echo${#x}
4
# 方法三
%expr"$x":".*"
4
PowerShell中, 调用字符串长度的属性就可以返回字符串长度了, 如下:PS C:\>"abcd"
abcd
PS C:\>"abcd".length
42. 我们接下来看看shell中 查找子串:%exprindex$x"a"
1
%exprindex$x"bc"
2
%exprindex$x"cd"
3
expr返回的数组下标是从1开始计数的. 看看PowerShell怎么应付呢?
PS C:\>$x="abcd"
PS C:\>$x.IndexOf('a')
0
PS C:\>$x.IndexOf('b')
1
PS C:\>$x.IndexOf('bc')
1
PS C:\>$x.IndexOf('cd')
2
PS C:\>$x.IndexOf('ef')
-13. 在Shell中得到子字符串:# 方法一
# expr <string> startpos length
%exprsubstr"$x"1 3
abc
%exprsubstr"$x"1 5
abcd
%exprsubstr"$x"2 5
bcd
# 方法二
# ${x:pos:lenght}
%echo${x:1}
bcd
%echo${x:2}
cd
%echo${x:0}
abcd
%echo${x:0:2}
ab
%pos=1
%len=2
%echo${x:$pos:$len}
bc
来看看PowerShell的Substring方法吧PS C:\>$x
abcd
PS C:\>$x.Substring(0,2)
ab
PS C:\>$x.Substring(0,4)
abcd
PS C:\>$x.Substring(0,6)
Exception calling"Substring"with"2"argument(s):"Index and length must refer to a location within the string.
Parameter name: length"
At line:1 char:13

+ $x.Substring( <<<< 0, 6)
PS C:\>trap{$x.Substring(0,6)}
PS C:\>
PowerShell不允许在对字符串操作过程中, 出现越界的情况. 因此其中一个例子给出了错误信息. 但是接下来我使用trap关键字, 将执行的异常捕获. 因此, 这次操作就什么都没有输出.
4. shell中匹配正则表达式:# 打印匹配长度
%exprmatch$x"."
1
%exprmatch$x"abc"
3
%exprmatch$x"bc"
0
这里可以看到, expr支持正则表达式, 匹配后给出了匹配的长度. 我们看看PowerShell内置的正则表达式运算符:PS C:\>$x-match'.';$matches;($matches).length
True
a
1
PS C:\>$x-match'abc';$matches;($matches).length
True
abc
3
PS C:\>$x-match'dc';$matches;($matches).length
False
abc
3
这里三个语句都发出了自己的执行结果, -match操作符返回bool值, 提示是否匹配成功. 如果匹配成功可以通过访问$matches这个hashtable获得返回情况. 默认整个正则表达式匹配的信息被放在key = 0的位置. 如果匹配不成功, $matches的信息是不会被更新的. 这些行为和Perl几乎一样. 熟悉Perl的朋友是不是觉得这个地方很自然??相比使用expr, 虽然这里复杂了一些, 但是功能确强大了很多.

5. 在Shell中对字符串的掐头去尾%x=aabbaarealwwvvww
%echo"${x%w*w}"
aabbaarealwwvv
%echo"${x%%w*w}"
aabbaareal
%echo"${x##a*a}"
lwwvvww
%echo"${x#a*a}"
bbaarealwwvvww
看看PowerShell的-replace运算符是如何工作的吧PS C:\>$x='aabbaarealwwvvww'
PS C:\>$x-replace'w*6. 在Shell中字符串的替换
这里不允许使用regex呢..不过可以用*,?...%x=abcdabcd
%echo${x/a/b}# 只替换一个
bbcdabcd
%echo${x//a/b}# 替换所有
bbcdbbcd
6. 在Shell中字符串的替换%x=abcdabcd
%echo${x/a/b}# 只替换一个
bbcdabcd
%echo${x//a/b}# 替换所有
bbcdbbcd
第一个例子用PowerShell好像不容易呢...因为-replace是整行匹配的. 这点上不如Perl的s:::功能强大. 我先给出第二个的办法...^^也许以后会想到好办法呢PS C:\>$x='abcdabcd'
PS C:\>$x-replace'a','b'
bbcdbbcd

xms77 发表于 2012-7-5 20:27:34

本帖最后由 xms77 于 2012-7-5 20:30 编辑

请看帮助文件的字符串处理函数说明:
$abc = 'adjfsldjf'
MsgBox(0,"变量$abc的值的长度是", StringLen($abc))至于正则查找和替换,请搜索论坛帖子,会有很多很多。

devinzhao 发表于 2012-7-5 21:40:47

好贴。强烈支持。

ooxxgod 发表于 2012-7-6 00:02:13

帮助里的很全面

chundong12 发表于 2012-7-6 11:42:41

應該學習學習一切有用信息

lchl0588 发表于 2012-7-6 13:07:12

只翻译了几段代码,正则部分略过.................$x="abcd"
;#方法一
;%exprlength$x
MsgBox(0,"我们来看Shell中求字符串长度的例子: ",StringLen($x))
;# 方法二
;%echo${#x}
MsgBox(0,"我们来看Shell中求字符串长度的例子: ",BinaryLen(StringToBinary(Eval("x"))))
;# 方法三
;%expr"$x":".*"
MsgBox(0,"我们来看Shell中求字符串长度的例子: ",StringSplit($x,""))
;-----------------------------------------------------------------------------------
;PS C:\>"abcd"
$x=FileGetLongName("d:\abcd")
MsgBox(0,"调用字符串长度的属性就可以返回字符串长度",StringSplit($x,"\"))
;abcd
;PS C:\>"abcd".length
MsgBox(0,"调用字符串长度的属性就可以返回字符串长度",StringLen(StringSplit($x,"\")))
;4
;--------------------------------------------------------------------------
$x="abcd"
;%exprindex$x"a"
MsgBox(0,"查找子串",StringInStr($x,"a"))
;1
;%exprindex$x"bc"
MsgBox(0,"查找子串",StringInStr($x,"bc"))
;2
;%exprindex$x"cd"
MsgBox(0,"查找子串",StringInStr($x,"cd"))
;3
;------------------------------------------------------------------------
$x=StringSplit("abcd","a")
MsgBox(0,"数组下标是从0开始计数的","1="&$x&@CR&"2="&$x&@CR&"3="&$x&@CR&"共有"&UBound($x)&"个");为了让大家明白是什么回事,故添加此步!!
;PS C:\>$x="abcd"
;PS C:\>$x.IndexOf('a')
MsgBox(0,"数组下标是从0开始计数的",StringInStr($x,"a")) ;呵呵,结果是0,千万不要被结果迷惑哦!这里的0是表示失败的意思,而不是真正的0!!
;0
;PS C:\>$x.IndexOf('b')
MsgBox(0,"数组下标是从0开始计数的",StringInStr($x,"b"))
;1
;PS C:\>$x.IndexOf('bc')
MsgBox(0,"数组下标是从0开始计数的",StringInStr($x,"bc"))
;1
;PS C:\>$x.IndexOf('cd')
MsgBox(0,"数组下标是从0开始计数的",StringInStr($x,"cd"))
;2
;PS C:\>$x.IndexOf('ef')
MsgBox(0,"数组下标是从0开始计数的",StringInStr($x,"ef"));这里结果也是0,而不是-1 注意哦!为啥?上面已解释!
;-1
;-----------------------------------------------------------------
$x="abcd"
;# 方法一
;# expr <string> startpos length
;%exprsubstr"$x"1 3
MsgBox(0,"得到子字符串",StringMid($x,1,3))
;abc
;%exprsubstr"$x"1 5
MsgBox(0,"得到子字符串",StringMid($x,1,5))
;abcd
;%exprsubstr"$x"2 5
MsgBox(0,"得到子字符串",StringMid($x,2,3))
;bcd
;# 方法二
;# ${x:pos:lenght}
;%echo${x:1}
MsgBox(0,"得到子字符串",StringTrimLeft($x,1))
;bcd
;%echo${x:2}
MsgBox(0,"得到子字符串",StringTrimLeft($x,2))
;cd
;%echo${x:0}
MsgBox(0,"得到子字符串",StringTrimLeft($x,0))
;abcd
;%echo${x:0:2}
MsgBox(0,"得到子字符串",StringTrimRight($x,2))
;ab
;%pos=1
;%len=2
;%echo${x:$pos:$len}
MsgBox(0,"得到子字符串",StringTrimLeft(StringTrimLeft($x,1)&StringTrimRight($x,1),4))
;bc
;------来看看PowerShell的Substring方法吧   代码类同上面的组合,不再写了-------------
页: [1]
查看完整版本: 不同语言对字符串的处理