Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 替换/审查_Java_Replace - Fatal编程技术网

Java 替换/审查

Java 替换/审查,java,replace,Java,Replace,我在一个叫做测验的系统里工作 剩下的最后一件事就是“线索”。目前我有 <id value="100"> <question value="Who said E=mc2"/> <answear value="Einstein"/> <clue1 value="E*******"/> <clue2 value="E******n"/> <clue3 value

我在一个叫做测验的系统里工作

剩下的最后一件事就是“线索”。目前我有

   <id value="100"> 
      <question value="Who said E=mc2"/> 
      <answear value="Einstein"/> 
      <clue1 value="E*******"/> 
      <clue2 value="E******n"/> 
      <clue3 value="Ei****in"/> 
   </id> 

我想从xml中删除这些线索,因为很难手动完成它们。。。 所以我做了一些事情,但我失败了

public class Test 
{
    public static void main(String[] argv) throws Exception 
    {
        System.out.println(replaceSubString("Einstein", "*", 3));
    }

    static String[] letters = {"e","i"};

    public static String replaceSubString(final String str, final String newToken, int max) 
    {
        if ((str == null) || (newToken == null)) 
        return str;

        StringBuffer buf = new StringBuffer(str.length());
        int start = 0, end = 0;

        for(int i = 0; i < letters.length; i++)
        {
            if(Rnd.get(100) > 50) //50% to add the symbol
            {
                while ((end = str.indexOf(letters[i], start)) != -1) 
                {
                    buf.append(str.substring(start, end)).append(newToken);
                    start = end + 1;
                    if (--max == 0) 
                        break;
                }
            }
        }

        buf.append(str.substring(start));
        return buf.toString();
    }
}
公共类测试
{
公共静态void main(字符串[]argv)引发异常
{
System.out.println(replaceSubString(“Einstein”,“*”,3));
}
静态字符串[]字母={e”,“i”};
公共静态字符串替换子字符串(最终字符串str、最终字符串newToken、int max)
{
if((str==null)| |(newToken==null))
返回str;
StringBuffer buf=新的StringBuffer(str.length());
int start=0,end=0;
for(int i=0;i50)//50%添加符号
{
while((end=str.indexOf(字母[i],start))!=-1)
{
buf.append(str.substring(start,end)).append(newToken);
开始=结束+1;
如果(--max==0)
打破
}
}
}
追加(str.substring(start));
返回buf.toString();
}
}
编译结果=>'Einst*in'

循环不起作用。。idk。。仅替换数组中的第一个字母

如果有人愿意帮助我,我将非常感激


-谢谢

为什么不使用JDOM之类的东西并按名称获取XML元素呢

SAXBuilder b = New SAXBuilder();
Document doc = b.build(pathToFile);
List<?> elements = b.getChildren("clue");
for (Element e : elements ) {
  (Element) e.setAttribute("value", 
    obfuscateClueText(e.getAttribute("value")); //updated, see below
}

为什么不使用像JDOM这样的东西并按名称获取XML元素呢

SAXBuilder b = New SAXBuilder();
Document doc = b.build(pathToFile);
List<?> elements = b.getChildren("clue");
for (Element e : elements ) {
  (Element) e.setAttribute("value", 
    obfuscateClueText(e.getAttribute("value")); //updated, see below
}

像这样的怎么样

public String generatClue(String answer,int level){
    if(level >= answer.length()/2)
        return answer.replaceAll("[^ ]","*");

    return answer.substring(0,level)
      + answer.substring(level,answer.length()-level).replaceAll("[^ ]","*")
      + answer.substring(answer.length()-level);
}
输出:

generateClue("Einstein",1);
=> E******n
generateClue("Einstein",3);
=> Ein**ein
generateClue("Einstein",4)
=> Einstein
generateClue("Hans Christian Andersen",4)
=> Hans ********* ****rsen
generateClue2("Hans Christian Andersen",4);
=> Han* C*ri*tian Ande*sen
generateClue2("Hans Christian Andersen",4);
=> *ans Chr*sti*n An*ersen
generateClue2("Hans Christian Andersen",17);
=> H**s ******i** ***e****
generateClue2("Hans Christian Andersen",23);
=> **** ********* ********
编辑:这里有一个用于字符串中的随机字符:

public String generatClue2(String answer,int level){
    if(answer.length()==level)
        return answer.replaceAll("[^ ]","*");

    Random rand=new Random();

    for(int i=0; i<level; ++i){
        char c;
        int n;
        do{
            n=rand.nextInt(answer.length());
            c=answer.charAt(n);
        }
        while(c == ' ' || c == '*');
        answer = answer.substring(0,n) + '*' + answer.substring(n+1);
    }
    return answer;
}

像这样的怎么样

public String generatClue(String answer,int level){
    if(level >= answer.length()/2)
        return answer.replaceAll("[^ ]","*");

    return answer.substring(0,level)
      + answer.substring(level,answer.length()-level).replaceAll("[^ ]","*")
      + answer.substring(answer.length()-level);
}
输出:

generateClue("Einstein",1);
=> E******n
generateClue("Einstein",3);
=> Ein**ein
generateClue("Einstein",4)
=> Einstein
generateClue("Hans Christian Andersen",4)
=> Hans ********* ****rsen
generateClue2("Hans Christian Andersen",4);
=> Han* C*ri*tian Ande*sen
generateClue2("Hans Christian Andersen",4);
=> *ans Chr*sti*n An*ersen
generateClue2("Hans Christian Andersen",17);
=> H**s ******i** ***e****
generateClue2("Hans Christian Andersen",23);
=> **** ********* ********
编辑:这里有一个用于字符串中的随机字符:

public String generatClue2(String answer,int level){
    if(answer.length()==level)
        return answer.replaceAll("[^ ]","*");

    Random rand=new Random();

    for(int i=0; i<level; ++i){
        char c;
        int n;
        do{
            n=rand.nextInt(answer.length());
            c=answer.charAt(n);
        }
        while(c == ' ' || c == '*');
        answer = answer.substring(0,n) + '*' + answer.substring(n+1);
    }
    return answer;
}

我以前试过这个方法

public class Test 
{
    static String s = "Hans Christian Andersen";

    public static void main(String[] args) 
    {
        char c = '*';
        System.out.println(replaceCharAt(s, 0, c));
    }

    public static String replaceCharAt(String s, int pos1, char c) 
    {
         StringBuffer buf = new StringBuffer(s);
         int max = (s.length()-3), contor = 0;

         while (contor < max)
         {
             for(int i = pos1; i < (s.length()); i++)
             {
                 if(Rnd.get(100) > 50 && contor < max)  
                 {
                     buf.setCharAt(i, c);
                     contor++;
                 }
             }
         }

         return buf.toString();
    }
}

我以前试过这个方法

public class Test 
{
    static String s = "Hans Christian Andersen";

    public static void main(String[] args) 
    {
        char c = '*';
        System.out.println(replaceCharAt(s, 0, c));
    }

    public static String replaceCharAt(String s, int pos1, char c) 
    {
         StringBuffer buf = new StringBuffer(s);
         int max = (s.length()-3), contor = 0;

         while (contor < max)
         {
             for(int i = pos1; i < (s.length()); i++)
             {
                 if(Rnd.get(100) > 50 && contor < max)  
                 {
                     buf.setCharAt(i, c);
                     contor++;
                 }
             }
         }

         return buf.toString();
    }
}

你想产生线索,就这样?循环确实有效,也许你应该用更多的单词和字母进行测试?@Nicolas Repiquet-是的。。这就是你想要产生的线索,就是这样?循环确实有效,也许你应该用更多的单词和字母来测试?@Nicolas Repiquet-是的。。是的,但我有3条线索,我必须为每个字母生成随机符号,因为手动很难。是的,我会在新答案中再尝试一次。是的,但我有3条线索,我必须为每个字母生成随机符号,因为手动很难,我会给它一个新的答案。嗯…但当我有一些空间?汉斯·克里斯蒂安·安德森:你是说你想保留空白吗?如果是这样,您只需编写自己的
replaceAll
方法,并在给定字符串上循环,同时将所有字符替换为
*
,除了空格。谢谢!我想知道在您的方法中是否可以在字符串中随机打印“”,我的意思是“Has C*********Aner**”-再次感谢!嗯…但是当我有空间的时候?汉斯·克里斯蒂安·安德森:你是说你想保留空白吗?如果是这样,您只需编写自己的
replaceAll
方法,并在给定字符串上循环,同时将所有字符替换为
*
,除了空格。谢谢!我想知道在您的方法中是否可以在字符串中随机打印“”,我的意思是“Has C*********Aner**”-再次感谢!