2014-01-30 27 views
1

我需要模仿終端的操作。因此,舉例來說,如果我有解析java中的轉義空格

  • "a quoted string" anotherParam我想["a quoted string", "anotherParam"]
  • test\ folder somethingElse shoould成爲["test folder", somethingElse]

我該怎麼辦呢?我一直在嘗試正則表達式,但似乎沒有得到它的正確...主要問題是differenciating空格,指示下一個參數,並應該成爲相同的參數逃脫空間

順便說一句,我不能只使用庫提供的Java類

目前的代碼使用

[^\s]+ 

所以它認爲任何東西,那不是空間的原因,是有可能包括逃脫的空間?或者也許是更好的解決方法呢?我順利通過了,現在除非我找到一個更好的

+0

爲什麼'測試\文件夾somethingElse'變爲'[ 「測試文件夾」,somethingElse]'? – Maroun

+1

因爲空間已經逃脫了。例如,如果您鍵入'mkdir test \ folder',它將創建一個名爲「test folder」的文件夾。 –

+0

嘗試'/(?:「((\\」| [^「])*)」|((\ S | \ \)+))/'。我也建議使用解析器。 – Njol

回答

0

一種可能性是預處理輸入用的東西真的不可能拿出像:[email protected]:那麼所有的正則表達式的東西/符號化後更換逃脫的空間,我替換字符串用空格。它運作良好,到目前爲止

+0

嘿,你介意接受我的回答還是讓我知道它是否適合你的需求?謝謝 ;) – ccjmne

0

我認爲,你可以使用這個正則表達式來找到你的參數:

"(((?!").)+)"|(\S|(?<=\\)\s)+ 

其中給出,一旦轉錄爲Java String:

"\"(((?!\").)+)\"|(\\S|(?<=\\\\)\\s)+" 

這是怎麼回事工作原理:

它匹配"(((?!").)+)"(\S|(?<=\\)\s)+

  1. "(((?!").)+)"匹配任何由"
  2. (\S|(?<=\\)\s)+包圍相匹配的是由什麼:
    2.1。 非空格字符\S)或
    2.2。 空格字符\s)如果他們是轉義(緊接在前面\)。對於"a quoted string"a\ third\ param一次,一次anotherParam和一次:

運行這個表達式反對:

"a quoted string" anotherParam a\ third\ param 

三次匹配。


樣品測試的代碼:

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

public class Main { 
    public static void main(String[] args) { 
     final Pattern p = Pattern.compile("\"(((?!\").)+)\"|((\\S|(?<=\\\\)\\s)+)"); 
     final String input = "\"a quoted string\" anotherParam a\\ third\\ param"; 

     final Matcher m = p.matcher(input); 
     while(m.find()) { 
      if(m.group(1) == null) { 
       System.out.println(m.group().replace("\\ ", " ")); 
      } else { 
       System.out.println(m.group(1)); // trimmed from the surrounding quotes 
      } 
     } 
    } 
} 

輸出:

a quoted string 
anotherParam 
a third param