查找由特殊标记

时间:2015-10-29 19:27:34

标签: java string algorithm oop data-structures

我有一个字符串来处理它的部分被“标记”自定义标记,以指示字符串中与其余部分“不同”的区域。

例:
This is an {TypeAStart}arbitrary long{TypeAEnd} text

arbitrary long部分是字符串中感兴趣的区域 我想要一个很好的方法来获取字符串的这一部分的开始和结束索引,并且使用正则表达式我可以做到(regex question
使用这种方法的问题是:
1)我不能轻易概括它 2)我的主要目标是以字符串This is an arbitrary long text结束,并使用另一个数据结构来描述应用了哪个标记以及最终字符串中的位置。
我无法通过正则表达式看到任何直接的方法。

我想要达到的目标是这些自定义标记的数组作为对并处理字符串以查找所有这些子字符串 示例输入:

This is an {TypeAStart}arbitrary long {SomeOtherStart} very very very {SomeOtherEnd} long long{TypeAEnd} text  

已知标记:
[TypeAStart,TypeAEnd],[SomeOtherStart,SomeOtherEnd]等

输出:

  • 这是一个任意长的非常非常长的文本
  • TypeA [11,50],SomeOther [26,40]

我该如何实现?

1 个答案:

答案 0 :(得分:0)

我有一个开源项目可以帮助解决这个问题:

http://mtimmerm.github.io/dfalex/

假设您有一个枚举标记,其值为TYPEASTART和TYPEAEND,并且可以说这些值实现了一个方法String text()来获取要搜索的字符串。

您可以将标记的模式添加到DfaBuilder,它将为您提供可用于在字符串中查找标记的DFA,如下所示:

DfaBuilder<Marker> builder = new DfaBuilder<>();
for (Marker val : Marker.values())
{
    builder.addPattern(Pattern.match(val.text()), val);
}
DfaState<Marker> START_STATE = builder.build();

然后您可以将它与StringMatcher一起使用来查找您的模式:

StringMatcher matcher = new StringMatcher(someString);
Marker found;
while((found = matcher.findNext(START_STATE))!=null)
{
    //found is the kind of marker we found
    //this is the start position in the string
    int startPos = matcher.getLastMatchStart();
    //this is the end position in the string
    int endPos = matcher.getLastMatchEnd();
}

如果您还记得开始标记的位置,当您找到匹配的结束标记时,可以轻松地在标记之间提取字符串。

要在没有标记的情况下获取字符串,请打开一个StringBuilder并用标记之间的东西填充它,直到你到达终点