【问题标题】:add char infront of each word in string with java [closed]用java在字符串中的每个单词前面添加char [关闭]
【发布时间】:2018-03-08 21:55:07
【问题描述】:

我正在尝试获取一个字符串并在字符串中的每个单词前面添加 + 以自动生成关键字

如果字符串是:绿羊

输出应该是:+Green +sheep

【问题讨论】:

  • String.replaceAll 应该可以帮到你。
  • @Flown replaceAll 不适用于第一个单词
  • s = s.replaceAll("\\b(\\pL)", "+$1");(用字母替换单词边界)。
  • 不幸的是,您的问题仅包含要求 - 它没有显示您自己为解决此问题所做的任何努力。请在此问题中添加您的尝试 - 因为该站点不是免费的“我们为您做(家庭)工作”服务。除此之外:请转至help center 了解如何/在这里问什么。谢谢!
  • 你的问题是......?

标签: java replace string-matching


【解决方案1】:

我们首先提取所有单词,然后对其进行操作,最后将它们作为句子放回去。

// Extract words
String[] words = theString.split(" ");

// Manipulate them
for (int i = 0; i < words.length; i++) {
    words[i] = "+" + words[i];
}

// Put them back as sentence
StringJoiner sj = new StringJoiner(" ");
for (String word : words) {
    sj.add(word);
}

String sentence = sj.toString();

StringJoiner 在每个参数之间添加一个" "(在构造函数中指定)。

请注意,此方法仅适用于 简单句子,其中每个单词都由 空格 分隔,而不是 逗号点 等等。

【讨论】:

  • 当一个replaceAll() can do it 时,为什么要经历所有这些?
  • 简单解决方案的复杂代码。
  • 是的,但是对于初学者来说,详细了解如何做到这一点确实很有帮助。
  • @Zabuza 开始阅读任何一本介绍 Java 的书。 SO的目的不同。 :-)
  • 确定更有效的解决方案是 theString.replaceAll()
【解决方案2】:

步骤:
1.根据空格分割字符串。
2. 循环迭代。
3. 获取单个字符串并在前面添加“+”,在后面添加空格并将字符串添加到最终字符串
4.重复第2、3步,直到第1步得到的list结束。

发布逻辑/伪代码总是比发布代码更好。
希望这会帮助你。 :-)

【讨论】:

  • 一个replaceAll()can do it为什么要经历这一切?
  • replaceAll 不适用于第一个单词,因为第一个单词不包含空格
  • 你错了。我在上一条评论中链接的评论显示了 replaceAll() 的正则表达式,它甚至适用于第一个单词。 this answer也是如此。
  • 我认为最好同时发布逻辑代码。
  • @Andreas,我读到你只写了 String.replaceAll() 方法。由于我的屏幕颜色褪色,错过了您的“可以做到”链接。 :-P
【解决方案3】:

有多种选择,我将重点介绍一个紧凑的 regex 答案,它使用匹配所有单词边界的\b,甚至是像Green, sheep. Green - sheep 这样的复杂单词边界。

解决方案

String text = "Green, sheep. Green - sheep";
String modifiedText = text.replaceAll("\\b(\\p{L}+)\\b", "+$1");
System.out.println(modifiedText);

哪些输出:

+Green, +sheep. +Green - +sheep

JDoodle Demo

说明

详细解释见regex101#K4k42n。许多测试 regex 的好网站之一。

简而言之,我们搜索单词\\p{L}(仅字母字符)、多个单词+、单词边界内\\b。然后将这些单词放入带有(...) 的捕获组中。在replaceAll 的第二个参数中,我们现在可以使用$ 来引用捕获组,$1 对应于第一个捕获组的匹配项,依此类推。

所以我们用符号+ 和单词本身$1 替换一个单词。

【讨论】:

  • 正则表达式的缺点是没有人知道发生了什么。当然它很方便,但它是一把双刃剑。
  • 确实如此。对于新手程序员来说,它是一个非常方便的工具。对于初学者,我会建议一种非常简单的手动方式,例如@ihsankocak 在他的回答中显示。好消息是来自正则表达式的\b 非常强大,很难手动检测复杂的边界。
猜你喜欢
  • 2017-07-19
  • 2017-09-11
  • 2018-03-23
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
相关资源
最近更新 更多