2011-03-15 64 views
1

我正在處理來自明文消息(HL7)的文本格式並將其重新格式化以供顯示。一個例子是\.sp5\。這意味着有五個換行符。查找並替換字符串模式N次,其中N在模式中定義

所以我想我會想要做這樣的事情:

Pattern.compile("\\\.sp(\d+)\\").matcher(retval).replaceAll("\n{$1}"); 

我的IDE告訴我,有在\d無效轉義序列,我不知道,如果ReplaceAll參數會做我期望的。我認爲正則表達式描述了「反斜槓點p一個或多個數字的反斜槓」,我希望替換說「放入$ 1換行符」。

我該如何做到這一點?

的解決方案是從下面2名評議的組合:

Pattern verticalSpacesPattern = Pattern.compile("\\\\\\.sp(\\d+)\\\\", Pattern.MULTILINE); 
Matcher verticalSpacesMatcher = verticalSpacesPattern.matcher(retval); 

while (verticalSpacesMatcher.find()) { 
    int lineBreakCount = Integer.parseInt(verticalSpacesMatcher.group(1)); 
    String lineBreaks = StringUtils.repeat("\n", lineBreakCount); 
    String group = verticalSpacesMatcher.group(0); 
    retval = StringUtils.replace(retval, group, lineBreaks); 
} 

回答

1

使用本:

public static void main(String[] args) throws Exception { 
      // Create a pattern to match comments 
      Pattern p = 
       Pattern.compile("\\\\.sp(\\d+)", Pattern.MULTILINE); 

      // Get a Channel for the source file 
      File f = new File("Replacement.java"); 
      FileInputStream fis = new FileInputStream(f); 
      FileChannel fc = fis.getChannel(); 

      // Get a CharBuffer from the source file 
      ByteBuffer bb = 
       fc.map(FileChannel.MAP_RO, 0, (int)fc.size()); 
      Charset cs = Charset.forName("8859_1"); 
      CharsetDecoder cd = cs.newDecoder(); 
      CharBuffer cb = cd.decode(bb); 

      // Run some matches 
      Matcher m = p.matcher(cb); 
    int i = 0; 
    int n=0; 
      while (m.find()) 
       n= Integer.parseInt(m.group(1)); //first group,0, is the whole string , 1 is the subgroup 
    for(i=0;i<n;i++) 
       System.out.println("\n"); 
    } 
+0

由於處理該問題的一般模式而被接受。我不得不使用Dave DiFranco的正則表達式。與sol'n編輯原始帖子 – Freiheit 2011-03-17 17:07:52

1

在Java正則表達式要求所有斜線加倍。 這是因爲「\」是字符串中的特殊字符,需要使用額外的斜線進行轉義。 所以,你可能想:

Pattern.compile("\\\\\\.sp(\\d+)\\\\").matcher(retval).replaceAll("\\n{$1}"); 
+1

您在開始時仍然缺少三個反斜槓。應該有四個反斜槓和兩個點。 – 2011-03-16 04:19:15

+0

是的,我認爲你的權利艾倫。我已經更新了我的答案。所有反斜槓都讓我頭疼。 – 2011-03-16 14:02:03

0

不能使用正則表達式的方式。相反,您應該將匹配的(\ d +)編號映射到替換.sp(\ d)+)的循環。 我從來沒有見過這種類型的替換,使用動態構造,順便說一句,正則表達式引擎必須鍵入匹配組,以確保這是一個數字而不是字符串。

所以我建議檢索數字,並根據數量使用它來構建替換模式\n\n...\n。然後你可以替換。

1

您必須避開反斜槓,以便編譯器忽略它們,但正則表達式引擎會看到它們。

Java源代碼中的字符串文字內的反斜槓按照Java語言規範的要求解釋爲Unicode轉義符或其他字符轉義符。因此,必須在代表正則表達式的字符串文字中加上反斜槓,以防止它們被Java字節碼編譯器解釋。

http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

replaceAll()部分不會做你想做的(重複更換的次數),因爲有在替換文本模式的規定。您必須捕捉整數與.group(1),將其轉換爲一個整數與Integer.valueOf(),然後repeat替換文本的次數。