标题: [问题求助] 解析一个包含vbs字符串格式的字符串 [打印本页]
作者: jyswjjgdwtdtj 时间: 2023-3-1 21:00 标题: 解析一个包含vbs字符串格式的字符串
比如:- ' "abcdefg"&"1111"&"11"" 23sdsd" '
复制代码
假设这是一个js字符串
里面的内容是一个vbs字符串,包含vbs的转义字符双引号""
那么如何把每个包含”vbs字符串“的字符串部分替换成其他东西呢?
主要是解决转意字符
怎么确定转义字符?
怎么区分"11"&""&"11"和"11"&""""&"11"?
作者: czjt1234 时间: 2023-3-2 20:51
没看懂,你是要js解析vbs
还是要在vbs解析js
作者: jyswjjgdwtdtj 时间: 2023-3-2 21:04
回复 2# czjt1234
显然是在js里解析vbs,当然在vbs里解析vbs也一样
作者: czjt1234 时间: 2023-3-2 21:16
Chr(34) = "
作者: 523066680 时间: 2023-3-2 21:21
本帖最后由 523066680 于 2023-3-2 21:50 编辑
这事得找老刘,老刘前阵子 Parser 练到结丹期了
之前没写过,尝试了一下,写的极度简陋,抛个砖:- my $raw = '"12"& """""" &"34" & """" & 56 & "-" & ""';
- my @buff = split( //, $raw );
-
- my $result = full_string();
- printf "\nResult:%s\n", $result;
-
- sub full_string
- {
- # unit
- # full_string & unit
-
- my $left = unit();
- while (1)
- {
- printf "full_string: %s\n", $left;
- my $token = shift @buff;
- if ( $token =~ /&/ )
- {
- # 忽略& 右边的空格
- shift @buff unless $buff[0] ne " ";
- $left .= unit();
- #printf "full_string: %s\n", $left;
- }
- # 忽略 & 左边的空格
- elsif ( $token eq " " ) { next; }
- elsif ( not defined $token ) { return $left; }
- else { printf "unknow case:%s, left: %s\n", $token, join("", @buff); }
- }
-
- printf "full_string: %s\n", $left;
- }
-
- sub unit
- {
- # /"/ inner /"/
- # number
-
- my $token = shift @buff;
- if ( $token =~ /\d/ )
- {
- my $number = $token;
- while ( scalar(@buff) > 0 and $buff[0] =~ /[\d\.]/ )
- {
- $number .= shift @buff;
- }
-
- printf "number:%d\n", $number;
- return $number;
- }
- elsif ( $token =~ /"/ )
- {
- my $inner = inner();
- $token = shift @buff;
- if ( not defined $token or $token !~ /"/ )
- {
- warn "wrong inner string, not ending by \"";
- }
- return $inner;
- }
- elsif ( $token =~ " " ) { return ""; }
- else { warn "what ?"; }
- }
-
- sub inner
- {
- # escape
- # string
- # empty
- # string include escape
- my $string = "";
-
- while (1)
- {
- my $token = shift @buff;
- return $string unless defined $token;
-
- if ( $token =~ /"/ )
- {
- if ( scalar(@buff) >= 2 and $buff[0] =~ /"/ )
- {
- $string .= q/"/;
- shift @buff;
- }
- # 如果处于最末尾
- elsif ( scalar(@buff) == 0 )
- {
- unshift @buff, $token;
- return $string;
- }
- # 如果一个双引号引用的字符串完结,返回阶段性结果
- elsif ( scalar(@buff) > 2 and join("", @buff) =~ /^\s*&/ )
- {
- unshift @buff, $token;
- printf "inner: $string\n";
- return $string;
- }
- else
- {
- warn "something wrong: " .join("", @buff);
- }
- }
- else
- {
- $string .= $token;
- }
- }
- }
复制代码
parser大致结构:- full_string:
- unit
- full_string & unit
-
- unit:
- "inner" //字符串
- number //数值 - 没有双引号
-
- inner:
- escape //双引号转义
- string //双引号内的字串
- empty //空白
- string include escape //包含双引号转义的字串
复制代码
识别过程和输出结果- inner: 12
- full_string: 12
- inner: ""
- full_string: 12""
- full_string: 12""
- inner: 34
- full_string: 12""34
- full_string: 12""34
- inner: "
- full_string: 12""34"
- full_string: 12""34"
- number:56
- full_string: 12""34"56
- full_string: 12""34"56
- inner: -
- full_string: 12""34"56-
- full_string: 12""34"56-
- full_string: 12""34"56-
-
- Result:12""34"56-
复制代码
作者: jyswjjgdwtdtj 时间: 2023-3-2 21:52
回复 4# czjt1234
欸vbs字符串里双引号的转义是""如"sdfhjshdfjk""sdkflsdkjlf",相当于
"sdfhjshdfjk"&chr(34)&"sdkflsdkjlf"
作者: jyswjjgdwtdtj 时间: 2023-3-2 21:55
perl没学过抱歉看不太懂啊
作者: 老刘1号 时间: 2023-3-2 22:43
回复 5# 523066680
然而我并没有看懂楼主在说啥(
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |