更智能的方法来隔离未格式化字符串中的值?

时间:2016-05-15 15:43:30

标签: actionscript-3

我在AIR应用中使用xpdf将PDF动态转换为PNG。在转换之前,我想获取页数并使用xdf的pdfinfo实用程序打印到stdout,然后解析该字符串以获取页数。

我的第一个解决方案:按换行符拆分字符串,测试结果数组中的“Pages:”字符串等。

我的解决方案有效,但感觉笨重而脆弱。我想要替换所有的双空格,在“:”上进行拆分并构建一个哈希表 - 但是字符串中有冒号的时间戳会搞砸。

有更好或更聪明的方法吗?

    protected function processPDFinfo(data:String):void
    {
        var pageCount:Number = 0;

        var tmp:Array = data.split("\n");

        for (var i:int = 0; i < tmp.length; i++){
            var tmpStr:String = tmp[i];

            if (tmpStr.indexOf("Pages:") != -1){
                var tmpSub:Array = tmpStr.split(":");
                if (tmpSub.length){
                    pageCount = Number(tmpSub[tmpSub.length - 1]);
                }
                break;
            }
        }

        trace("pageCount", pageCount);
    }
Title:          Developing Native Extensions  
Subject:        Adobe Flash Platform  
Author:         Adobe Systems Incorporated  
Creator:        FrameMaker 8.0  
Producer:       Acrobat Distiller Server 8.1.0 
CreationDate:   Mon Dec  7 05:45:39 2015  
ModDate:        Mon Dec  7 05:45:39 2015  
Tagged:         yes  
Form:           none  
Pages:          140  
Encrypted:      no  
Page size:      612 x 783 pts (rotated 0 degrees)  
File size:      2505564 bytes  
Optimized:      yes  
PDF version:    1.4  

1 个答案:

答案 0 :(得分:1)

例如使用regular expressions,例如:

/Pages:\s*(\d+)/g

第一个(也是唯一一个)捕获组是您要查找的数字字符串。

var pattern:RegExp = /Pages:\s*(\d+)/g;
var pageCount:int = parseInt(patern.exec(data)[1]);
  

我理解大约2%(/ Pages:/ g)。它正在查找字符串文字Pages:,然后查找spaces wildcardescaping d+的内容

我知道,正则表达式很难。如果您的IDE支持它们,那么真正有助于创建它们。还有像regexr这样的在线工具(我第一次在这里使用版本2,它甚至比版本1更好,非常好!)一般来说,你希望有一个工具可以提供即时视觉反馈< / strong>匹配的内容。

下面是您的文字和我的模式在regexr中的屏幕截图。

regexr in action

您可以将鼠标悬停在所有内容上并获取各种信息。 左侧的侧栏是关于正则表达式的完整文档。

可选的 explain 标签会逐步完成给定的模式。

\s*是任意数量的空白字符,\d+至少是一个数字字符。

  

并返回一个数组??

这是故事的As3部分。使用模式创建RegExp对象后,您可以使用exec()在某些String上执行该对象。 (不确定为什么他们选择了方法名称的延迟缩写)

返回值有点时髦:

  

返回

     

对象 - 如果没有匹配,null;否则,具有以下属性的对象:

     
      
  • 一个数组,其中元素0包含完整匹配的子字符串,数组的其他元素(1到n)包含与正则表达式中的括号组匹配的子字符串
  •   
  • index - 字符串
  • 中匹配子字符串的字符位置   
  • input - 字符串(str)
  •   

您必须查看exec()的文档才能真正理解这一点。它是一种JS风格,将一堆变量保存在一个通用对象中,该对象也充当数组。

这是我的示例代码中的[1]来自。