Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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_Regex - Fatal编程技术网

如何留住人才。java正则表达式中的点

如何留住人才。java正则表达式中的点,java,regex,Java,Regex,我的程序如下, /** * @param args */ public static void main(String[] args) { RegularExpressions r = new RegularExpressions(); // TODO Auto-generated method stub String []input = {" Dear [name],\n", "

我的程序如下,

    /**
     * @param args
     */
    public static void main(String[] args) {
        RegularExpressions r = new RegularExpressions();
        // TODO Auto-generated method stub
        String []input = {" Dear [name],\n",
                "\n",
                "Thanks for buying the [num] [item].\n",
                "We appreciate your patronage\n",
                "\n",
                "Best, [sales_person]\n"};
        HashMap<String, String> dic = new HashMap<String, String>();
        dic.put("name", "Anna Bell Smith");
        dic.put("num", "eight");
        dic.put("item", "Boxes of Soap.");
        dic.put("sales_person", "Karmine Smithe");
        String []afterChange = r.replace(input, dic);
        r.display(afterChange);

    }
    String [] replace(String []strings, Map<String, String> dict){
        String patternStr = ".(";
        for(String key:dict.keySet()){
            patternStr = patternStr + key + "|";
        }
        patternStr = patternStr.substring(0, patternStr.length()-1);
        patternStr = patternStr+").";
        Pattern pattern = Pattern.compile(patternStr);
        for(int i=0;i<strings.length;i++){
            StringBuffer sb = new StringBuffer();
            Matcher matcher = pattern.matcher(strings[i]);
            boolean isMatcherFind = false;
            while(matcher.find()){

            matcher.appendReplacement(sb, dict.get(matcher.group(1)));
                isMatcherFind = true;
            }

            if(isMatcherFind){
                strings[i] = sb.toString();
            }else{
                strings[i] = strings[i];
            }
        }
        return strings; 

    }
    void display(String []str){
        for(String s:str){
            System.out.println(s);
        }
    }
}
而我期望输出为

Dear Anna Bell Smith


Thanks for buying the eight Boxes of Soap.
We appreciate your patronage



Best, Karmine Smithe.

这意味着,
点(.)和“\n”
应该保留,而不是用空格替换。我是java 8版本,请告诉我如何保留
dot(.)和“\n”

您必须明确使用
appendReplacement
appendTail
。不幸的是,您必须使用
StringBuffer
来执行此操作。下面是一个片段:

    String content="aaaaaaaaaa";
Pattern pattern = Pattern.compile("a");
Matcher m = pattern.matcher(content);

StringBuffer sb = new StringBuffer();
final int N = 3;
for (int i = 0; i < N; i++) {
  if (m.find()) {
     m.appendReplacement(sb, "b");
  } else {
     break;
  }
}
m.appendTail(sb);
System.out.println(sb); // bbbaaaaaaa
String content=“aaaaaaaa”;
Pattern=Pattern.compile(“a”);
Matcher m=模式匹配器(内容);
StringBuffer sb=新的StringBuffer();
最终整数N=3;
对于(int i=0;i

根据

您有一个循环,该循环反复调用
matcher.find()
来查找字符串中的下一个匹配项;然后调用
appendReplacement()
appendReplacement
的javadoc说明它可以:

  • 它从输入序列中读取字符,从append位置开始,然后将它们追加到给定的字符串缓冲区。它在读取上一个匹配之前的最后一个字符(即索引开始处的字符)(-1)后停止

  • 它将给定的替换字符串追加到字符串缓冲区

  • 它将此匹配器的附加位置设置为最后一个匹配字符的索引加上一个,即to end()

  • 因此,对于每个匹配项,它都会将字符追加到匹配项,然后追加替换字符串(而不是匹配的字符串)。到目前为止,一切顺利

    但是当没有比赛时会发生什么呢?在最后一个匹配项的右侧,输入中仍有未附加到输出的字符


    幸运的是,有一种方法完全正确地处理了你:

    你真的应该考虑一个现有的模板引擎,比如FrimaLARK。这个问题已经解决了,真的没有理由重新发明轮子。我相信你的意思是*wheel@JimGarrisonLike Jim说:使用模板引擎。这还有一个额外的优点,那就是你可以将文本保留在你的代码之外,这将使任何非开发人员在需要时更容易更改文本。点在替换字符串中。OP正在搜索的模式中没有点。那你为什么建议反斜杠呢?反斜杠点只会在图案中产生差异,而不会在替换字符串中产生差异。你的回答不正确。
        String content="aaaaaaaaaa";
    Pattern pattern = Pattern.compile("a");
    Matcher m = pattern.matcher(content);
    
    StringBuffer sb = new StringBuffer();
    final int N = 3;
    for (int i = 0; i < N; i++) {
      if (m.find()) {
         m.appendReplacement(sb, "b");
      } else {
         break;
      }
    }
    m.appendTail(sb);
    System.out.println(sb); // bbbaaaaaaa