2011-05-25 128 views
5

我正在編寫的程序(使用Java)獲取由三種部分組成的輸入數據,並用斜槓/分隔。部件可以是以下之一:使用正則表達式區分字符串中的斜槓

  1. 匹配正則表達式\w*
  2. 呼叫匹配表達式\w*\(.*\)
  3. 路徑匹配表達式<.*>|\".*\"。 A 路徑可以包含斜槓。

的示例串看起來是這樣的:

bar/foo()/foo(bar)/<foo/bar>/bar/"foo/bar"/foo() 

它具有以下結構

name/call/call/path/name/path/call 

我想拆分此字符串成部分,我試圖做到這一點使用正則表達式。我的當前表達式在調用路徑後捕獲了斜槓,但我無法在名稱之後捕獲斜線,而不包括路徑中可能存在的斜槓。我現在的表情,之後路徑電話剛剛捕獲斜槓是這樣的:

(?<=[\)>\"])/ 

如何展開這種表達後也捕捉斜線不包括內路徑斜線?

+1

這將是極大幫助,如果您也說您正則表達式匹配應該包含什麼爲您的樣品字符串,準確。 – Tomalak 2011-05-25 12:44:34

+0

@Tomalak我想要捕捉零件之間的*斜槓*,以便我可以將字符串分開。 – 2011-05-25 12:54:08

+0

如果您使用我建議的表達式,則不需要拆分字符串 - 只需使用匹配。 ;) – Tomalak 2011-05-25 12:56:45

回答

3
(\w+|\w+\([^/]*\)(?:/\w+\([^/]*\))*|<[^>]*>|"[^"]*")(?=/|$) 

捕獲這個從字符串'bar/foo()/foo(bar)/<foo/bar>/bar/"foo/bar"/foo()'

  • 'bar'
  • 'foo()/foo(bar)'
  • '<foo/bar>'
  • 'bar'
  • '"foo/bar"'
  • 'foo()'

捕捉分離斜線,雖然(什麼? - 假設他們在那裏)。

的簡單(\w+|\w+\([^/]*\)|<[^>]*>|"[^"]*")(?=/|$)將捕獲單獨的呼叫:

  • "foo()"
  • "foo(bar)"

編輯:通常情況下,我做了正則表達式崩潰:

 
(   # begin group 1 (for alternation) 
    \w+  # at least one word character 
|   # or... 
    \w+  # at least one word character 
    \(  # a literal "(" 
    [^/]*  # anything but a "/", as often as possible 
    \)  # a literal ")" 
|   # or... 
    <   # a "<" 
    [^>]*  # anything but a ">", as often as possible 
    >   # a ">" 
|   # or... 
    "   # a '"' 
    [^"]*  # anything but a '"', as often as possible 
    "   # a '"' 
)   # end group 1 
(?=/|$)  # look-ahead: ...followed by a slash or the end of string 
3

我的第一個想法是將斜線與左側的引號進行匹配。 (即,具有類似(".*")*背後正面看,但這最終在一個異常說

Look-behind group does not have an obvious maximum length 

老實說,我認爲你是更好地與一個Matcher,使用或:編在一起的組件版本,(類似\w*|\w*\(.*\)|(<.*>|\".*\"))和while (matcher.find())

3

在你的輸入中使用你的字符串不會被轉義的內容可能不是最好的選擇,但是你的確有奢侈的「虛假」我建議...

  1. 拆分對整個字符串「/」
  2. 解析每個部分,直到到達路徑
  3. 開始把路徑元素融入到一個列表,直到路徑
  4. 結束歸隊的路徑回到「 /「

我強烈建議您考慮轉義路徑中的」/「,以使您的生活更輕鬆。

1

這種模式捕捉你的例子字符串的所有部分分別不包括定界符後的結果:

\w+\(.*?\)|<.*>|\".*\"|\w+ 
相關問題