我试图找出Java中是否有任何方法可以实现以下目标。
我想向方法传递一个参数,如下所示
"(hi|hello) my name is (Bob|Robert). Today is a (good|great|wonderful) day."
我希望该方法选择括号内以“|”分隔的单词之一 并返回带有随机选择的单词之一的完整字符串。Java 有什么方法可以解决这个问题,还是我必须自己在循环中使用逐个字符检查来编写代码?
您可以通过正则表达式对其进行解析。
正则表达式是\(\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];
}
}
(请注意,这段代码只是为了说明一个想法而编写的,可能不会编译)
可能有帮助,
将三个字符串 ("hi|hello")、(Bob|Robert) 和 (good|great|wonderful) 作为参数传递给该方法。
内部方法将字符串拆分为数组,firststringarray[]=thatstring.split("|");
将其用于其他两个。
并使用它来使用随机字符串选择。
据我所知,java没有任何方法可以直接做到这一点。
我必须为它编写代码或正则表达式
Java 没有为此提供任何现成的方法。您可以使用 Penartur 描述的 Regex 或创建自己的 java 方法来拆分字符串并存储随机单词。如果遵循第二种方法,StringTokenizer 类可以为您提供帮助。
我不认为 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
}
对此没有直接的支持。理想情况下,您不应该尝试低级别的解决方案。
您应该搜索“随机句子生成器”。你写作的方式
`(Hi|Hello)`
等等称为语法。您必须为语法编写一个解析器。同样,编写解析器有很多解决方案。有指定语法的标准方法。寻找 BNF。
解析器和生成器问题已经解决了很多次,问题中有趣的部分将是编写语法。