2016-02-02 2 views
2

Моя программа, как показано ниже,Как сохранить. точка в ява регулярных выражений

/** 
    * @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 SoapWe appreciate your patronage 
Best, Karmine Smithe 

В то время как я ожидал выход в

Dear Anna Bell Smith 


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



Best, Karmine Smithe. 

Значение, dot(.) and "\n" следует сохранить вместо того, чтобы заменить его пустым пространством. Я версия java 8, дайте мне знать, как я могу сохранить dot(.) and "\n"

+5

Вы действительно должны рассмотреть существующий механизм шаблонов, такой как FreeMarker. Эта проблема уже решена, и нет причин изобретать колесо. –

+0

Я считаю, что вы имели в виду * Wheel @JimGarrison – Spencer4134

+0

Как Джим сказал: используйте шаблонный двигатель. Это имеет дополнительное преимущество, что вы можете сохранить текст вне своего кода, что облегчит для любого не разработчика изменение текста, если это необходимо. – Marged

ответ

0

Вы должны использовать явно 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 

согласно matcher-replace-method

+0

Вы полностью пропустили точку. Точка находится в заменяющей строке. В шаблоне, который ищет OP, нет точек. – ajb

+0

Тогда почему вы предлагаете обратный слэш? Точки с обратным слэшем делают только разницу в шаблоне, а не в заменяющей строке. Ваш ответ неверен. – ajb

1

У вас есть цикл, который неоднократно вызывает matcher.find(), чтобы найти следующий матч в строке; затем он вызывает appendReplacement(). Javadoc для appendReplacement говорит, что делает это:

  1. Она считывает символы из входной последовательности, начиная с позиции дописывания, и добавляет их к заданной строке буфера. Он останавливается после прочтения последнего символа, предшествующего предыдущему совпадению, то есть символ в начале индекса() - 1.

  2. Он добавляет данную строку замены в буфер строки.

  3. Он устанавливает положение присоединения этого сопряжения к индексу последнего совпадающего символа плюс один, то есть к концу().

Таким образом, для каждого матча, он добавляет символы до матча, то он добавляет строку замены (вместо строки, которые получили согласованный). Все идет нормально.

Но что происходит, когда больше нет совпадений? На входе все еще оставлены символы, справа от последнего совпадения, которые не добавляются к выходу.

К счастью, есть способ, который точно подходит именно вам: appendTail.

Смежные вопросы