【问题标题】:Complicated substring and string concatenation复杂的子字符串和字符串连接
【发布时间】:2015-09-18 18:05:28
【问题描述】:
String target = "When user fills in #this# in form #that#"
// I have my function in removing all content in between paired "##"
String processedTarget = "When user fills in ## in form ##"
// processedTarget is generated using the function from target

String input = "When user fills in #test#"
// Same function is used in here to process input
String processedInput = "When user fills in ##"
//processedInput is generated using the same way

以一种简单的方式(仅使用 Java 内置方法),我如何生成" in form #that#"? 目的是将用户输入与目标进行比较,无论输入的"##" 之间的内容如何,​​但应呈现"##" 之间的目标剩余内容。

如果目标以输入开头(无论 PAIRED ## 中的内容如何),则通过返回句子的其余部分来完成句子(使用名为 output 或类似名称的变量)。 如果目标不是以输入开头(忽略 PAIRED ## 中的内容不匹配),则返回 null(output 应为 null)。

在示例中,输入匹配目标。

【问题讨论】:

  • 您能否提供一个示例输入以及相应的预期输出?
  • @Manu " in form #that#"。代码块后面我已经写好了。
  • 您能解释一下为什么" in form #that#" 是预期结果吗?你能告诉我们你的代码和要求吗,因为现在还不清楚。
  • @Pshemo 因为我真的不关心成对的“#”和“#”中的内容,所以我删除了它们之间的所有内容。但是我需要用目标中的原始内容(包括成对的“#”和“#”中的内容)来完成句子,这就是为什么" in form #that#"而不是" in form ##"是正确的输出。
  • 如果你真的想生成" in form of #that#",那么在你的字符串target中搜索第一次出现“#this#”然后返回从那个位置开始的子字符串,基本上是一个单线。我真的不知道你的目标是什么,当问题写得这么糟糕时,我认为不可能给出一个好的答案。

标签: java string algorithm substring concatenation


【解决方案1】:

您可以使用String.replaceFirst(String, String)processedInputprocessedTarget 中删除。

要在输出中包含第二个 ## 组,您必须更改函数。

String processedInput = "When user fills in ##";
String processedTarget = "When user fills in ## in form #that#"; // Keep the second
String output = processedTarget.replaceFirst(processedInput, "");

【讨论】:

  • " in form #that#" 是所需的输出。所以我相信它涉及给定的所有四个字符串。
  • 请不要更改字符串processedTarget。它是使用我自己的方法生成的,删除了配对 "##" 中的所有内容。请参阅我对问题的最新评论。
  • @JiajuShen 您提供的代码不知道第二个## 组中的内容。因此,将它包含在输出中的唯一方法是更改​​删除它的方法。
  • 但是用户输入可以包含任意内容,包括任意数量的配对"##",我怀疑更改删除配对"##"中内容的方法没有帮助。
  • @JiajuShen 你只需要在输出中剪掉你不想要的东西。如果您不知道怎么做,您可以提出一个新问题。
【解决方案2】:

您需要将用户输入转换为正则表达式:

String target = "foo #word# bar #word# bar #word# foo #word#";
String input = "bar #first# bar #another#";

String regex = input.replaceAll("#[^#]*#", "#[^#]*#");
String output = target.replaceAll(regex, "");

output 变为 foo #word# foo #word#,如果我正确理解了您的问题,这就是您想要的 :)

【讨论】:

  • 如果输入不是以exact开头(##中的内容除外)"foo #word# bar #word#"应该没有输出。
  • 谢谢,我可以自己写了。事实上,我正在这样做。我只是好奇是否有内置函数可以做到这一点。
【解决方案3】:

你可以试试这样的正则表达式:

String regex = "When user fills in #[^#]*# in form #[^#]*#(.*)"

然后将其用作Pattern:

Pattern pattern = Pattern.compile(regex);

并且有一个匹配器可以用来检索结果,例如:

Matcher matcher = pattern.matcher("When user fills in #null# in form of #void#, he sucks");

那么你可以使用matcher.matches()matcher.group(1)来获取结果,应该是:

", he sucks"

我不确定这是否正是你想要的,因为我真的不知道你的意图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2018-01-06
    • 2013-03-02
    • 2013-12-29
    相关资源
    最近更新 更多