2017-09-05 73 views
-2

我正在寻找一个简单/快速的方法来从字符串识别和提取主题标签#标签提取,并暂时单独存放 - 例如:查找和文本

如果我有以下字符串:

2017-08-31这是一个无用的句子作为例子。 #例子#日期:2017-09-01 #NothingWow(然后更多的文字为好措施)。

然后,我希望能够得到这个:

#Example 
#Date:2017-09-01 
#NothingWow 

我想将其存储在的TStringList应该是足够的,直到我完成了。我只是需要将它们存储在原始字符串之外以便于交叉引用,然后如果原始字符串发生更改,请在末尾添加它们。 (但是这很容易 - 它的我遇到麻烦提取部)

应该在#和结尾/休息开始,当它遇到一个[空格]

的方式我最初的计划是经过使用布尔标志(默认为False),然后检查不同的主题标签,如果发现他们设置为true,并提取任何东西[:]分开。 (但我敢肯定有更好的方法做到这一点

任何意见将不胜感激。

+2

解析由字符字符串的字符。当你遇到'#'时,记下这个位置。当您遇到空格或字符串末尾时,将哈希标记添加到列表中。然后,如果还剩下更多的字符串,请像以前一样继续。 –

回答

3

下面显示了一个简单的控制台应用程序,您可以使用该控制台应用程序作为解决方案的基础 。它的工作原理是,将输入字符串分配给StringListDelimitedText属性会导致StringList将输入解析为一系列空间有限的行。那么寻找那些以#开头的东西就很简单了。

该代码是作为Delphi控制台应用程序编写的,但转换为Lazarus/FPC应该是微不足道的。

代码:

program HashTags; 

{$APPTYPE CONSOLE} 

uses 
    Classes, SysUtils; 

procedure TestHashTags; 
var 
    TL : TStringList; 
    S : String; 
    i : Integer; 
begin 
    TL := TStringList.Create; 
    try 
    S := '2017-08-31 This is a useless sentence being used as an example. #Example #Date:2017-09-01 #NothingWow (and then some more text for good measure)'; 
    TL.DelimitedText := S; 
    for i := 0 to TL.Count - 1 do begin 
    if Pos('#', TL[i]) = 1 then 
     writeln(i, ' ', TL[i]); 
    end; 
    finally 
    TL.Free; 
    end; 
    readln; 
end; 

begin 
    TestHashTags; 
end. 
+1

'TL:= TStringList.Create;尝试......' – Sami

+0

@Sami:感谢您的发现。这是一个错误的编辑。 – MartynA

+0

我看到你做了什么...我只需要两个_StringLists_ - 第一个用于分隔文本,第二个用于保存实际结果 - 谢谢。 – Marius