2012-06-04 6 views
0

Я следующий код для выполнения некоторых регулярных выражений на строкурегулярное выражение для в Java

public class RegexForPresto { 

public static void main(String[] args) { 

    Pattern p = Pattern.compile("^M^M rawtostampedMsg^L 48^UT "); 

    String candidateString = "^M^M rawtostampedMsg^L 48^UT 1338802566.906^EOH^name; 

    Matcher matcher = p.matcher(candidateString); 
    String tmp = matcher.replaceAll(""); 

    System.out.println(tmp); 
    } 

    } 

Вместо того, чтобы просто получить

^EOH^name 

я получаю следующий результат, когда я исполняю

^M^M rawtostampedMsg^L 48^UT 1338802566.906^EOH^name 

Также можно удалить «^ EOH ^» из строки, чтобы получить только «имя» в качестве вывода. Я не знаю, как удалить специальный символ («^»). Любая помощь приветствуется.

Заранее спасибо.

+0

Ваш circumflexions не делать то, что вы думаете, что они есть. – tchrist

+1

«^» - специальный символ для RegEx. Вы можете использовать шаблон Pattern.quote() для этого. http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern.html#quote%28java.lang.String%29 – Garbage

ответ

1

Хотя я не проверял код, я думаю, что это должно работать для вас:

public class RegexForPresto { 

public static void main(String[] args) { 

    Pattern p = Pattern.compile(Pattern.quote("^M^M rawtostampedMsg^L 48^UT ")); // <-- This line is changed 

    String candidateString = "^M^M rawtostampedMsg^L 48^UT 1338802566.906^EOH^name; 

    Matcher matcher = p.matcher(candidateString); 
    String tmp = matcher.replaceAll(""); 

    System.out.println(tmp); 
} 
} 
+0

работает отлично. Спасибо. – user745475

2

вы могли бы использовать этот шаблон

.*EOH.(.*) 

затем получить результат от первой группы захвата, как это:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import org.junit.Test; 

import junit.framework.Assert; 

public class PatternTest { 
    @Test public void testPatter() { 
     Pattern p = Pattern.compile(".*EOH.(.*)"); 
     String candidateString = "^M^M rawtostampedMsg^L 48^UT 1338802566.906^EOH^name"; 
     Matcher matcher = p.matcher(candidateString); 
     if(matcher.matches()){ 
      String tmp = matcher.group(1); 
      Assert.assertEquals("name", tmp); 
     } 
    } 
} 
+0

Отлично работает. thanks :) – user745475

1

Это не ясно, что вы пытаетесь сделать. Похоже, вы хотите рассматривать ˆ как обычный символ. В этом случае вам нужно избежать этого в регулярном выражении с помощью \\ˆ.

^ - особый символ.

Вы также можете попробовать онлайн-тестер, например this one. Это будет быстрее протестировать, и он будет более четко объяснять, что соответствует.

+1

Вместо того чтобы экранировать специальный символ с '\\', я предпочел бы использовать Pattern.quote() http://docs.oracle.com/javase/1.5.0/docs/api/java/util /regex/Pattern.html#quote%28java.lang.String%29 – Garbage

+0

Это работает, когда все символы должны быть экранированы. Он может решить эту конкретную проблему, но не является общим решением. Из прошлого опыта это может вызвать проблемы в будущем, когда кто-то должен обновить выражение, потому что он стал «реальным» регулярным выражением. Я предпочитаю начинать с беглых персонажей (но это предает мой возраст ...). – chr

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