我想替换运算符之间的字符串。鉴于and
,or
和not
分别代表^
,v
和~
。以下代码仅替换所有and
和^
。
import java.util.Scanner;
public class Paragraphconv
{
public static void main(String[] args) {
System.out.println("Enter a paragraph ");
Scanner scanF = new Scanner(System.in);
String str = scanF.nextLine();
String newStr = str.replace("and", "^");
System.out.println(newStr);
}
}
我尝试过使用replace()
方法,我只能将运算符替换为符号,同时保留句子。
应该发生的是:
INPUT
狗饿了,人类给它食物。本和托比和玛丽亚是 好朋友。你想要你的咖啡苦还是甜?我不再喜欢你了。
输出
x ^ y
x ^ y ^ z
x v y
~x
我还没有尝试将句子改为变量,因为我不知道应该包括什么。 (注意,上面的给定字符串是无意义的并且由用户输入,即不固定)
答案 0 :(得分:0)
直接replace
不会这样做,如帖子的评论中所述。更好的方法是使用regular expressions来分割每个句子。在Java中,它使用Pattern和Matcher类
我会分2个阶段执行这样的任务:
将段落拆分为句子。一种简化的方法是,例如,用分隔符分割字符串。':
/* note that split accepts a regex as parameter, so we need to escape '.'' */
String[] sentences = paragraph.split("\\.");
for(String sentence : sentences)
System.out.println(handleSentence(sentence));
现在,对于主要部分,用正则表达式解析每个句子并处理递归中句子的每个部分:
import java.util.regex.Pattern;
/* ... */
String handleSentence(String s) {
Pattern andPattern = Pattern.compile("(.*) and (.*)");
Pattern notPattern = Pattern.compile("not (.*)");
/* patterns for the rest of the operators here... */
Matcher m;
m = andPattern.matcher(s);
if (m.matches()){
/* we have an "and" sentence */
String preAnd = m.group(1);
String postAnd = m.group(2);
String res = "(" + handleSentence(preAnd) + "^" + handleSentence(postAnd) + ")";
return res;
}
m = notPattern.matcher(s);
if (m.matches()){
/* we have a "not" sentent */
String postNot = m.group(1);
String res = "~" + handleSentence(postNot);
return res;
}
/* and so on ... */
/*
if there's no match, just convert it to xyz etc.
nextAvailableVar will check what is the next variable name that is not used
and return it as a String
*/
return nextAvailableVar();
}
现在,这段代码并不完整,并且可能有更有效的方法,但它应该让您了解如何执行此类任务。