4

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

我想向方法传递一个参数,如下所示

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

我希望该方法选择括号内以“|”分隔的单词之一 并返回带有随机选择的单词之一的完整字符串。Java 有什么方法可以解决这个问题,还是我必须自己在循环中使用逐个字符检查来编写代码?

4

6 回答 6

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];
  }

} 

(请注意,这段代码只是为了说明一个想法而编写的,可能不会编译)

于 2012-06-29T05:44:11.933 回答
5

可能有帮助,

将三个字符串 ("hi|hello")、(Bob|Robert) 和 (good|great|wonderful) 作为参数传递给该方法。

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

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

于 2012-06-29T05:51:19.303 回答
1

据我所知,java没有任何方法可以直接做到这一点。

我必须为它编写代码或正则表达式

于 2012-06-29T05:44:03.437 回答
0

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

于 2012-06-29T06:00:23.250 回答
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
}
于 2012-06-29T05:47:17.010 回答
0

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

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

`(Hi|Hello)`

等等称为语法。您必须为语法编写一个解析器。同样,编写解析器有很多解决方案。有指定语法的标准方法。寻找 BNF。

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

于 2012-06-29T05:51:08.670 回答