字符串操作模式 - java

只是想知道是否存在一组用于复杂字符串操作的设计模式?

基本上,我要解决的问题是我需要能够读取字符串,如下所示:

“[name_of_kicker]看上去要踢出一个净空踢,但受到[name_of_defending_team]球员的真正压力。他得到一个[length_of_kick]踢开,但是完全碰到了对方。”

要么

“[name_of_kicker]从[name_of_passer]接球并发射炸弹。[name_of_kicker]确实联系良好,给了几个[name_of_attacking_team]追赶者足够的时间,使其在落下时进入球下。”

并将每个"tag"替换为可能的值,并检查该字符串是否等于另一个字符串。

因此,举例来说,代表玩家的任何标签我都必须能够替换为代表玩家的22个字符串值中的任何一个。但是我还需要确保我已经遍历播放器的每种组合,以找到可能在字符串中找到的各种标签。注意,以上两个示例中列出的标签并不是唯一可能的标签,任何句子中都可能出现无数其他标签。

我曾尝试创建一组嵌套的for循环来遍历播放器的集合等,并尝试每次替换标签,但是由于标签存在很多可能性,我只是在另一个内创建了一个嵌套的for循环,已经变得难以管理,而且我怀疑效率低下,因为我需要像上面的示例一样循环遍历1000个以上的基本字符串,并用播放器等替换差异标签,等等。

因此,有没有我可以研究的任何String操作模式,或者有人可以解决这种问题吗?

参考方案

首先,回答您的问题。

只是想知道是否存在一组用于复杂字符串操作的设计模式?

并不是的。有一些技术,但是它们几乎不能视为设计模式。我想到的两种技术是模板扩展和模式匹配。

您当前正在/打算做的是一种模板扩展形式。但是,典型的模板引擎不支持您尝试执行的组合扩展,并且正如您期望的那样,这似乎是解决问题的低效方法。

更好的技术似乎是模式匹配。让我们以第一个示例为例,并将其转换为模式:

“(罗纳迪诺|马拉多纳|彼得·希尔顿|杰基·查尔顿)似乎要踢出一个解围球,但受到(埃弗顿|皇家马德里|阿德莱德联)球员的某些实际压力。他得到([0-9] +米)一脚踢开,但完全可以触及。”

我所做的是将所有可能的替代品插入到伪模板中,以将其变成正则表达式。现在,我可以将此正则表达式编译为java.util.Pattern,并使用它与您的其他字符串列表进行匹配。

话虽如此,如果您试图通过这种方式来“分析”文本,那么我不会评估您获得成功的机会。我认为您最好走NLP路线。

Java:找到特定字符并获取子字符串 - java

我有一个字符串4.9.14_05_29_16_21,我只需要获取4.9。数字各不相同,所以我不能简单地获得此char数组的前三个元素。我必须找到最正确的.并将其子字符串化直到那里。我来自Python,因此我将展示Python的实现方法。def foobar(some_string): location = some_string.rfind('.&…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

Java string.hashcode()提供不同的值 - java

我已经在这个问题上停留了几个小时。我已经注释掉所有代码,认为这与数组超出范围有关,但是这种情况仍在发生。我正在尝试使用扫描仪从文件中读取输入,存储数据并稍后使用哈希码获取该数据。但是哈希值不断变化。public static void main(String[] args) { //only prior code is to access data char…

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…