[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 解析一个包含vbs字符串格式的字符串

比如:
  1. ' "abcdefg"&"1111"&"11""  23sdsd" '
复制代码
假设这是一个js字符串
里面的内容是一个vbs字符串,包含vbs的转义字符双引号""
那么如何把每个包含”vbs字符串“的字符串部分替换成其他东西呢?
主要是解决转意字符
怎么确定转义字符?
怎么区分"11"&""&"11"和"11"&""""&"11"?
你好

没看懂,你是要js解析vbs
还是要在vbs解析js

QQ 20147578

TOP

回复 2# czjt1234


    显然是在js里解析vbs,当然在vbs里解析vbs也一样
你好

TOP

Chr(34) = "

QQ 20147578

TOP

本帖最后由 523066680 于 2023-3-2 21:50 编辑

这事得找老刘,老刘前阵子 Parser 练到结丹期了

之前没写过,尝试了一下,写的极度简陋,抛个砖:
  1. my $raw = '"12"& """""" &"34" & """" & 56 & "-" & ""';
  2. my @buff = split( //, $raw );
  3. my $result = full_string();
  4. printf "\nResult:%s\n", $result;
  5. sub full_string
  6. {
  7.     # unit
  8.     # full_string & unit
  9.     my $left = unit();
  10.     while (1)
  11.     {
  12.         printf "full_string: %s\n", $left;
  13.         my $token = shift @buff;
  14.         if ( $token =~ /&/ )
  15.         {
  16.             # 忽略& 右边的空格
  17.             shift @buff unless $buff[0] ne " ";
  18.             $left .= unit();
  19.             #printf "full_string: %s\n", $left;
  20.         }
  21.         # 忽略 & 左边的空格
  22.         elsif ( $token eq " " )      { next; }
  23.         elsif ( not defined $token ) { return $left; }
  24.         else { printf "unknow case:%s, left: %s\n", $token, join("", @buff); }
  25.     }
  26.     printf "full_string: %s\n", $left;
  27. }
  28. sub unit
  29. {
  30.     # /"/ inner /"/
  31.     # number
  32.     my $token = shift @buff;
  33.     if ( $token =~ /\d/ )
  34.     {
  35.         my $number = $token;
  36.         while ( scalar(@buff) > 0 and $buff[0] =~ /[\d\.]/ )
  37.         {
  38.             $number .= shift @buff;
  39.         }
  40.         printf "number:%d\n", $number;
  41.         return $number;
  42.     }
  43.     elsif ( $token =~ /"/ )
  44.     {
  45.         my $inner = inner();
  46.         $token = shift @buff;
  47.         if ( not defined $token or $token !~ /"/ )
  48.         {
  49.             warn "wrong inner string, not ending by \"";
  50.         }
  51.         return $inner;
  52.     }
  53.     elsif ( $token =~ " " )  { return ""; }
  54.     else                     { warn "what ?"; }
  55. }
  56. sub inner
  57. {
  58.     # escape
  59.     # string
  60.     # empty
  61.     # string include escape
  62.     my $string = "";
  63.     while (1)
  64.     {
  65.         my $token = shift @buff;
  66.         return $string unless defined $token;
  67.         if ( $token =~ /"/ )
  68.         {
  69.             if ( scalar(@buff) >= 2 and $buff[0] =~ /"/ )
  70.             {
  71.                 $string .= q/"/;
  72.                 shift @buff;
  73.             }
  74.             # 如果处于最末尾
  75.             elsif ( scalar(@buff) == 0 )
  76.             {
  77.                 unshift @buff, $token;
  78.                 return $string;
  79.             }
  80.             # 如果一个双引号引用的字符串完结,返回阶段性结果
  81.             elsif ( scalar(@buff) > 2 and join("", @buff) =~ /^\s*&/ )
  82.             {
  83.                 unshift @buff, $token;
  84.                 printf "inner: $string\n";
  85.                 return $string;
  86.             }
  87.             else
  88.             {
  89.                 warn "something wrong: " .join("", @buff);
  90.             }
  91.         }
  92.         else
  93.         {
  94.             $string .= $token;
  95.         }
  96.     }
  97. }
复制代码
parser大致结构:
  1. full_string:
  2.     unit
  3.     full_string & unit
  4. unit:
  5.     "inner"  //字符串
  6.     number   //数值 - 没有双引号
  7. inner:
  8.     escape //双引号转义
  9.     string //双引号内的字串
  10.     empty  //空白
  11.     string include escape //包含双引号转义的字串
复制代码
识别过程和输出结果
  1. inner: 12
  2. full_string: 12
  3. inner: ""
  4. full_string: 12""
  5. full_string: 12""
  6. inner: 34
  7. full_string: 12""34
  8. full_string: 12""34
  9. inner: "
  10. full_string: 12""34"
  11. full_string: 12""34"
  12. number:56
  13. full_string: 12""34"56
  14. full_string: 12""34"56
  15. inner: -
  16. full_string: 12""34"56-
  17. full_string: 12""34"56-
  18. full_string: 12""34"56-
  19. Result:12""34"56-
复制代码

TOP

回复 4# czjt1234


    欸vbs字符串里双引号的转义是""如"sdfhjshdfjk""sdkflsdkjlf",相当于
"sdfhjshdfjk"&chr(34)&"sdkflsdkjlf"
你好

TOP

perl没学过抱歉看不太懂啊
你好

TOP

回复 5# 523066680


    然而我并没有看懂楼主在说啥(

TOP

返回列表