从字符串的一部分中选择一个单词?

时间:2012-06-29 05:40:04

标签: java string

我试图找出Java中是否有任何方法可以实现以下目的。

我想传递一个方法,如下面的参数

"(hi|hello) my name is (Bob|Robert). Today is a (good|great|wonderful) day."

我想让方法选择括号内的一个单词,用'|'分隔并使用随机选择的单词之一返回完整的字符串。 Java是否有任何方法可以解决这个问题,还是我必须使用循环中的字符检查来自己编写代码?

6 个答案:

答案 0 :(得分:6)

您可以通过正则表达式解析它。

正则表达式为\(\w+(\|\w+)*\);在替换中你只需将参数拆分为'|'并返回随机单词。

这样的东西
import java.util.regex.*;

public final class Replacer {

  //aText: "(hi|hello) my name is (Bob|Robert). Today is a (good|great|wonderful) day."
  //returns: "hello my name is Bob. Today is a wonderful day."
  public static String getEditedText(String aText){
    StringBuffer result = new StringBuffer();
    Matcher matcher = fINITIAL_A.matcher(aText);
    while ( matcher.find() ) {
      matcher.appendReplacement(result, getReplacement(matcher));
    }
    matcher.appendTail(result);
    return result.toString();
  }

  private static final Pattern fINITIAL_A = Pattern.compile(
    "\\\((\\\w+(\\\|\w+)*)\\\)",
    Pattern.CASE_INSENSITIVE
  );

  //aMatcher.group(1): "hi|hello"
  //words: ["hi", "hello"]
  //returns: "hello"
  private static String getReplacement(Matcher aMatcher){
    var words = aMatcher.group(1).split('|');
    var index = randomNumber(0, words.length);
    return words[index];
  }

} 

(请注意,此代码仅用于说明一个想法,可能无法编译)

答案 1 :(得分:5)

可能有帮助,

传递三个字符串(“hi | hello”),(Bob | Robert)和(good | great | wonderful)作为方法的参数。

Inside方法将字符串拆分为数组 by,firststringarray[]=thatstring.split("|");将此用于其他两个。

并使用this来使用随机字符串选择。

答案 2 :(得分:1)

据我所知,java没有任何方法可以直接进行。

我必须为它或regexe编写代码

答案 3 :(得分:0)

我认为Java没有任何可以直接做你想要的东西。就个人而言,我不会做基于正则表达式或字符的事情,而是制作类似的方法:

String madLib(Set<String> greetings, Set<String> names, Set<String> dispositions)
{
    // pick randomly from each of the sets and insert into your background string
}

答案 4 :(得分:0)

没有直接的支持。理想情况下,您应该尝试低级解决方案。

你应该搜索'随机句子生成器'。你的写作方式

`(Hi|Hello)`

等。被称为语法。你必须为语法编写一个解析器。再次提供了许多用于编写解析器的解决方案。有标准的方法来指定语法。寻找BNF。

解析器和生成器问题已经解决了很多次,问题的有趣部分将是编写语法。

答案 5 :(得分:0)

Java没有为此提供任何现成的方法。您可以使用Penartur描述的Regex或创建自己的java方法来拆分字符串并存储随机字。如果遵循第二种方法,StringTokenizer类可以帮助您。