0

我在 i-net Designer(另一个 Crystal Report 类型程序)中执行此操作。
我的问题有两个部分...

我正在尝试从字符串中“提取”部分字符串。我需要的字符串将始终位于主字符串的中间。但永远不会处于相同的位置。描述和长度总是会改变。

下面是一个例子。
描述(这是我从中“提取”的主要字符串):

    The Name of my Book Here CD CTN1234-5678-9 2-1 CD Carton

第 1 部分
我要提取的字符串是 Part#, CTN1234-5678-9。这将始终是 14 个字符长(3 个字母、9 个数字和 2 个破折号)。

第 2 部分
我只需要描述部分。这是本书的标题,从左至 Part#(CTN1234-5678-9)。所以我只需要 我的书名 CD

在“公式编辑器”中为我的公式字段 @PartNumber 和 @Description 执行此操作

4

3 回答 3

1

我敢肯定有一种更简单的方法-但这有效:

local stringVar myString   := 'The Name of my Book Here CD CTN1234-5678-9 2-1 CD Carton';
local numberVar myPosition := len(myString);

while not(mid(myString, myPosition - 14, 14) like '???????-????-?') and myPosition > 14
 do myPosition := myPosition - 1;

mid(myString, myPosition - 14, 14);
于 2012-07-12T16:01:07.453 回答
0

对于第 2 部分 - 描述我想出了这个(只是修改了最后一行代码):
再次感谢@Lee Tickett
感谢您的帮助!

local stringVar myString := 'The Name of my Book Here CD CTN1234-5678-9 2-1 CD Carton';
local numberVar myPosition := length(myString);

while not(mid(myString, myPosition - 14, 14) like '???????-????-?') and myPosition > 14
 do myPosition := myPosition - 1;

uppercase(trim(left(myString, myPosition - 15)));
于 2012-07-12T17:09:52.023 回答
0

您可以使用正则表达式:

// {@Book Title}
// ([A-Z]{3}[0-9]{4}-[0-9]{4}-[0-9]{1}) - matches the part #
// (.*?) - a non-greedy captured group
// (?= ) - a look-ahead
RegexMatch( "(.*?)(?=([A-Z]{3}[0-9]{4}-[0-9]{4}-[0-9]{1}))" )

您将需要Crystal Reports 正则表达式库

于 2012-07-12T17:48:21.367 回答