拆分大字符串

Posted

技术标签:

【中文标题】拆分大字符串【英文标题】:Split large string 【发布时间】:2017-11-04 09:51:45 【问题描述】:

我有一个长文本需要转换为小字符串,以便我可以将其包含到 AutoIt 脚本中。如果我包含多行文本,它将显示error unterminated string。所以我应该有:

"numbercharswillbe10" &_ "othernumbersofcharwillbe10" &_ etc..

如何用& _ -delimiters 分割它?

【问题讨论】:

【参考方案1】:

字符串连接

根据Documentation - Language Reference - Operators:

& 连接/连接两个字符串。

&= 串联赋值。

例子:

Global $g_sText = "Long " & "string " & "here." & @CRLF

$g_sText &= "More text." & @CRLF

ConsoleWrite($g_sText)

多行语句

根据Documentation - Language Reference - Comments(强调添加,因为它会导致提到的“未终止的字符串”错误):

虽然每行只允许一个语句,但如果将下划线“_”前面有一个空格放在“断”行的末尾,则长语句可以跨越多行。 字符串定义不能多行拆分,需要使用串联。

例子:

Global Const $g_sText = "Long " & _
                        "string " & _
                        "here." & _
                        @CRLF & _
                        "More text." & _
                        @CRLF

ConsoleWrite($g_sText)

双引号

根据Documentation - FAQ - Double quotes:

如果你想在字符串中使用双引号,那么你必须“加倍”。因此,对于您想要的每一个报价,您应该使用两个。 ...

或者使用单引号代替...

Examples 可从源获得。

默认值和限制

根据Documentation - Appendix - Limits/defaults:

4095 一行脚本的最大大小。

2,147,483,647 最大字符串长度。

根据Documentation - Language Reference - Datatypes - Strings:

所有 AutoIt 字符串都使用 UTF-16(实际上更准确地说是 UCS-2)编码。

根据Documentation - Intro - Unicode Support:

AutoIt 的一些部分还没有完全支持 Unicode。它们是:

Send 和 ControlSend - 改为使用 ControlSetText 或剪贴板函数。 控制台操作转换为 ANSI。

替代方案

hard coding 的替代方案包括 ClipGet()FileRead()

剪贴板中的文本

示例(先选择并复制文本CTRL + C):

Global Const $g_sText = ClipGet()

ConsoleWrite($g_sText & @CRLF)

文件中的文本

示例(先创建C:\my_long_string.txt):

#include <FileConstants.au3>

Global Const $g_sFile = 'C:\my_long_string.txt'
Global Const $g_sText = _TextFromFile($g_sFile)

ConsoleWrite($g_sText & @CRLF)

Func _TextFromFile(Const $sFile)
    Local       $hFile = FileOpen($sFile, $FO_READ + $FO_UTF8_NOBOM)
    Local Const $sData = FileRead($hFile)

    FileClose($hFile)
    Return $sData
EndFunc

拆分字符串

硬编码手动字符串拆分的替代方案包括StringSplit()_StringExplode() (related) 和StringMid()

结构

StringSplit() 将字符串拆分为:

单个字符(在空分隔符上), 单词(在空格 分隔符上)或 行(在@CRLF@LF@CR 分隔符上)。

等长

StringMid() 返回字符串的一部分。可以用来分割成等长的部分。示例(无错误检查,先选择并复制文本 CTRL + C):

#include <Array.au3>

Global Const $g_iSize  = 10
Global Const $g_sText  = ClipGet()
Global Const $g_aArray = _StringSplitEqual($g_sText, $g_iSize)

_ArrayDisplay($g_aArray)

Func _StringSplitEqual(Const $sText, Const $iSize = 1)
    Local Const $iLength = StringLen($sText)
    Local Const $iParts  = Ceiling($iLength / $iSize)
    Local Const $iRest   = -1; $iLength - ($iSize * Floor($iLength / $iSize))
    Local       $iStart  = 0
    Local       $iCount  = 0
    Local       $aArray[$iParts]

    For $i1 = 0 To $iParts - 1

        $iStart      = ($i1 * $iSize) + 1
        $iCount      = ($i1 < $iParts - 1) ? $iSize : ($iRest ? $iRest : $iSize)
        $aArray[$i1] = StringMid($sText, $iStart, $iCount)

    Next

    Return $aArray
EndFunc

加入字符串

根据documentation:

_ArrayToString将一维或二维数组的元素放在一个字符串中,由指定的分隔符分隔

示例(先添加_StringSplitEqual()并选择并复制文本CTRL + C):

#include <Array.au3>

Global Const $g_iSize      = 10
Global Const $g_sStart     = '$sText = "'
Global Const $g_sEnd       = '"' & @CRLF
Global Const $g_sDelimiter = '" _' & @CRLF & '       & "'
Global Const $g_sText      = StringReplace(ClipGet(), @CRLF, '')
Global Const $g_aArray     = _StringSplitEqual($g_sText, $g_iSize)
Global       $g_sResult    = _ArrayToString($g_aArray, $g_sDelimiter)

$g_sResult = $g_sStart & $g_sResult & $g_sEnd
ConsoleWrite($g_sResult)

返回:

$sText = "AutoIt v3 " _
       & "is a freew" _
       & "are BASIC-" _
       & "like scrip" _
       & "ting langu" _
       & "age design" _
       & "ed for aut" _
       & "omating th" _
       & "e Windows " _
       & "GUI and ge" _
       & "neral scri" _
       & "pting."

【讨论】:

以上是关于拆分大字符串的主要内容,如果未能解决你的问题,请参考以下文章

通过python将一个大字符串拆分为包含'n'个单词的多个子字符串

将大字符串拆分为 SET 项 [重复]

在 JavaScript 中将大字符串拆分为 n 大小的块

C# 使用 Regex.Split 拆分大字符串。必须保留分隔符

用大写单词拆分字符串[关闭]

如何将一个大数组按照里面相同的数据拆分成多个子数组