2014-09-24 47 views
0

我正在使用節點,我需要將UNIX類型的grep命令應用於我在HTTP GET之後獲得的正文響應。 這裏是進入的文本(體變量):似乎無法爲特定情況制定正則表達式

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <om2m:discovery xmlns:om2m="http://uri.etsi.org/m2m" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"> 
    <om2m:matchSize>65</om2m:matchSize> 
    <om2m:discoveryURI> 
     <reference>gscl</reference> 
     <reference>gscl/scls</reference> 
     <reference>gscl/scls/subscriptions</reference> 
     <reference>gscl/scls/mgmtObjs</reference> 
     <reference>gscl/scls/mgmtObjs/subscriptions</reference> 
     <reference>gscl/applications</reference> 
     <reference>gscl/applications/subscriptions</reference> 
     <reference>gscl/applications/mgmtObjs</reference> 
     <reference>gscl/applications/mgmtObjs/subscriptions</reference> 
     <reference>gscl/accessRights</reference> 
     <reference>gscl/accessRights/subscriptions</reference> 
     <reference>gscl/groups</reference> 
     <reference>gscl/groups/subscriptions</reference> 
     <reference>gscl/containers</reference> 
     <reference>gscl/containers/subscriptions</reference> 
     <reference>gscl/subscriptions</reference> 
     <reference>gscl/accessRights/AR_ADMIN</reference> 
     <reference>gscl/accessRights/AR_ADMIN/subscriptions</reference> 
     <reference>gscl/scls/nscl</reference> 
     <reference>gscl/scls/nscl/applications</reference> 
     <reference>gscl/scls/nscl/applications/subscriptions</reference> 
     <reference>gscl/scls/nscl/applications/mgmtObjs</reference> 
     <reference>gscl/scls/nscl/applications/mgmtObjs/subscriptions</reference> 
     <reference>gscl/scls/nscl/accessRights</reference> 
     <reference>gscl/scls/nscl/accessRights/subscriptions</reference> 
     <reference>gscl/scls/nscl/groups</reference> 
     <reference>gscl/scls/nscl/groups/subscriptions</reference> 
     <reference>gscl/scls/nscl/containers</reference> 
     <reference>gscl/scls/nscl/containers/subscriptions</reference> 
     <reference>gscl/scls/nscl/subscriptions</reference> 
     <reference>gscl/scls/nscl/attachedDevices</reference> 
     <reference>gscl/scls/nscl/attachedDevices/subscriptions</reference> 
     <reference>gscl/scls/nscl/notificationChannels</reference> 
     <reference>gscl/scls/nscl/mgmtObjs</reference> 
     <reference>gscl/scls/nscl/mgmtObjs/subscriptions</reference> 
     <reference>gscl/scls/nscl/m2mPocs</reference> 
     <reference>gscl/applications/98191axla</reference> 
     <reference>gscl/applications/98191axla/subscriptions</reference> 
     <reference>gscl/applications/98191axla/containers</reference> 
     <reference>gscl/applications/98191axla/containers/subscriptions</reference> 
     <reference>gscl/applications/98191axla/accessRights</reference> 
     <reference>gscl/applications/98191axla/accessRights/subscriptions</reference> 
     <reference>gscl/applications/98191axla/groups</reference> 
     <reference>gscl/applications/98191axla/groups/subscriptions</reference> 
     <reference>gscl/applications/98191axla/notificationChannels</reference> 
     <reference>gscl/applications/98191axla/containers/SENSOR </reference> 
     <reference>gscl/applications/98191axla/containers/SENSOR/contentInstances</reference> 
     <reference>gscl/applications/98191axla/containers/SENSOR/contentInstances/subscriptions</reference> 
     <reference>gscl/applications/98191axla/containers/SENSOR/subscriptions</reference> 
     <reference>gscl/applications/98191axla/containers/SENSOR/contentInstances/CI_23326802</reference> 
     <reference>gscl/applications/98191axla/containers/DATA</reference> 
     <reference>gscl/applications/98191axla/containers/DATA/contentInstances</reference> 
     <reference>gscl/applications/98191axla/containers/DATA/contentInstances/subscriptions</reference> 
     <reference>gscl/applications/98191axla/containers/DATA/subscriptions</reference> 
     <reference>gscl/applications/98191axla/containers/DATA/contentInstances/CI_566628946</reference> 
     <reference>gscl/applications/98191axla/containers/CONT_81747241</reference> 
     <reference>gscl/applications/98191axla/containers/CONT_81747241/contentInstances</reference> 
     <reference>gscl/applications/98191axla/containers/CONT_81747241/contentInstances/subscriptions</reference> 
     <reference>gscl/applications/98191axla/containers/CONT_81747241/subscriptions</reference> 
     <reference>gscl/applications/98191axla/containers/SENSOR/contentInstances/CI_285448423</reference> 
     <reference>gscl/applications/98191axla/containers/CONT_360523761</reference> 
     <reference>gscl/applications/98191axla/containers/CONT_360523761/contentInstances</reference> 
     <reference>gscl/applications/98191axla/containers/CONT_360523761/contentInstances/subscriptions</reference> 
     <reference>gscl/applications/98191axla/containers/CONT_360523761/subscriptions</reference> 
     <reference>gscl/applications/98191axla/containers/DATA/contentInstances/CI_395775165</reference> 
    </om2m:discoveryURI> </om2m:discovery> 

從該文本,我需要提取應用容器,其中,在這種情況下,等於98191axla之間的ID。我試圖用匹配方法做到這一點:

var searchFor="\s<reference>gscl\/applications\.\d\/DATA\/contentInstances\/subscriptions<\/reference>"; 
     console.log("Looking for:"); console.log(searchFor); 
     var found = body.match(searchFor); 

它總是返回-1。我從來沒有使用過正則表達式,所以我不得不嘗試不同的東西......都沒有工作。 任何幫助非常感謝!

謝謝! (btw,我知道這是一個XML表示,但它不是一個複雜的孩子,所以我認爲操縱文本會更容易...)

+0

[你不能/嘗試用正則表達式解析xml/html](http://stackoverflow.com/a/1732454/560593),而是使用一些實際解析語言的東西。例如,有一個[xml2js](https://www.npmjs.org/package/xml2js)模塊,您可以導入並使用 – 2014-09-24 23:53:10

+0

我試過幾個庫(xml2js,xmldoc和libxmljs),但我只是認爲對於這個特定的應用程序和XML表示,正則表達式會更容易... – Dankex 2014-09-25 00:55:03

回答

1

可以使用的文字此代碼:

​​

請注意,斜槓之間聲明瞭一個正則表達式對象(不包括引號之間的模式)。

該模式使用\wcharacter class包含ascii數字和字母(和下劃線)。該類別後跟quantifier+表示一個或多個。 最後,要隔離你需要的子串,使用capture group

+0

這太棒了。我現在明白我做錯了什麼......謝謝! ;) – Dankex 2014-09-25 00:52:04

0

我不是一個正則表達式的專家,但以下似乎在這個數據集上工作。

//Your data simulated. 
 
var data = document.getElementById('data').innerHTML; 
 

 
var myRegexp = /\/applications\/([0-9a-zA-Z]*)\/containers/g; 
 

 
//Group iteration from: http://stackoverflow.com/a/432503/402706 
 
var match = myRegexp.exec(data); 
 
while (match != null) { 
 
    //write out each id that was found 
 
    console.log(match[1]); 
 
    // matched text: match[0] 
 
    // match start: match.index 
 
    // capturing group n: match[n] 
 
    match = myRegexp.exec(data); 
 
}
<script type='text' id='data'> 
 
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <om2m:discovery xmlns:om2m="http://uri.etsi.org/m2m" xmlns:xmime="http://www.w3.org/2005/05/xmlmime"> 
 
     <om2m:matchSize>65</om2m:matchSize> 
 
     <om2m:discoveryURI> 
 
      <reference>gscl</reference> 
 
      <reference>gscl/scls</reference> 
 
      <reference>gscl/scls/subscriptions</reference> 
 
      <reference>gscl/scls/mgmtObjs</reference> 
 
      <reference>gscl/scls/mgmtObjs/subscriptions</reference> 
 
      <reference>gscl/applications</reference> 
 
      <reference>gscl/applications/subscriptions</reference> 
 
      <reference>gscl/applications/mgmtObjs</reference> 
 
      <reference>gscl/applications/mgmtObjs/subscriptions</reference> 
 
      <reference>gscl/accessRights</reference> 
 
      <reference>gscl/accessRights/subscriptions</reference> 
 
      <reference>gscl/groups</reference> 
 
      <reference>gscl/groups/subscriptions</reference> 
 
      <reference>gscl/containers</reference> 
 
      <reference>gscl/containers/subscriptions</reference> 
 
      <reference>gscl/subscriptions</reference> 
 
      <reference>gscl/accessRights/AR_ADMIN</reference> 
 
      <reference>gscl/accessRights/AR_ADMIN/subscriptions</reference> 
 
      <reference>gscl/scls/nscl</reference> 
 
      <reference>gscl/scls/nscl/applications</reference> 
 
      <reference>gscl/scls/nscl/applications/subscriptions</reference> 
 
      <reference>gscl/scls/nscl/applications/mgmtObjs</reference> 
 
      <reference>gscl/scls/nscl/applications/mgmtObjs/subscriptions</reference> 
 
      <reference>gscl/scls/nscl/accessRights</reference> 
 
      <reference>gscl/scls/nscl/accessRights/subscriptions</reference> 
 
      <reference>gscl/scls/nscl/groups</reference> 
 
      <reference>gscl/scls/nscl/groups/subscriptions</reference> 
 
      <reference>gscl/scls/nscl/containers</reference> 
 
      <reference>gscl/scls/nscl/containers/subscriptions</reference> 
 
      <reference>gscl/scls/nscl/subscriptions</reference> 
 
      <reference>gscl/scls/nscl/attachedDevices</reference> 
 
      <reference>gscl/scls/nscl/attachedDevices/subscriptions</reference> 
 
      <reference>gscl/scls/nscl/notificationChannels</reference> 
 
      <reference>gscl/scls/nscl/mgmtObjs</reference> 
 
      <reference>gscl/scls/nscl/mgmtObjs/subscriptions</reference> 
 
      <reference>gscl/scls/nscl/m2mPocs</reference> 
 
      <reference>gscl/applications/98191axla</reference> 
 
      <reference>gscl/applications/98191axla/subscriptions</reference> 
 
      <reference>gscl/applications/98191axla/containers</reference> 
 
      <reference>gscl/applications/98191axla/containers/subscriptions</reference> 
 
      <reference>gscl/applications/98191axla/accessRights</reference> 
 
      <reference>gscl/applications/98191axla/accessRights/subscriptions</reference> 
 
      <reference>gscl/applications/98191axla/groups</reference> 
 
      <reference>gscl/applications/98191axla/groups/subscriptions</reference> 
 
      <reference>gscl/applications/98191axla/notificationChannels</reference> 
 
      <reference>gscl/applications/98191axla/containers/SENSOR </reference> 
 
      <reference>gscl/applications/98191axla/containers/SENSOR/contentInstances</reference> 
 
      <reference>gscl/applications/98191axla/containers/SENSOR/contentInstances/subscriptions</reference> 
 
      <reference>gscl/applications/98191axla/containers/SENSOR/subscriptions</reference> 
 
      <reference>gscl/applications/98191axla/containers/SENSOR/contentInstances/CI_23326802</reference> 
 
      <reference>gscl/applications/98191axla/containers/DATA</reference> 
 
      <reference>gscl/applications/98191axla/containers/DATA/contentInstances</reference> 
 
      <reference>gscl/applications/98191axla/containers/DATA/contentInstances/subscriptions</reference> 
 
      <reference>gscl/applications/98191axla/containers/DATA/subscriptions</reference> 
 
      <reference>gscl/applications/98191axla/containers/DATA/contentInstances/CI_566628946</reference> 
 
      <reference>gscl/applications/98191axla/containers/CONT_81747241</reference> 
 
      <reference>gscl/applications/98191axla/containers/CONT_81747241/contentInstances</reference> 
 
      <reference>gscl/applications/98191axla/containers/CONT_81747241/contentInstances/subscriptions</reference> 
 
      <reference>gscl/applications/98191axla/containers/CONT_81747241/subscriptions</reference> 
 
      <reference>gscl/applications/98191axla/containers/SENSOR/contentInstances/CI_285448423</reference> 
 
      <reference>gscl/applications/98191axla/containers/CONT_360523761</reference> 
 
      <reference>gscl/applications/98191axla/containers/CONT_360523761/contentInstances</reference> 
 
      <reference>gscl/applications/98191axla/containers/CONT_360523761/contentInstances/subscriptions</reference> 
 
      <reference>gscl/applications/98191axla/containers/CONT_360523761/subscriptions</reference> 
 
      <reference>gscl/applications/98191axla/containers/DATA/contentInstances/CI_395775165</reference> 
 
     </om2m:discoveryURI> </om2m:discovery> 
 
</script>

+0

有趣的解決方案。肯定會使用這個,因爲它很容易調整,以更好地爲不同的唯一ID做工。 – Dankex 2014-09-25 01:02:54

0

你可以這樣說:

var data = '<reference>gscl/applications/98191axla/containers/CONT_81747241</reference>'; 

console.log(data.match(/\/applications\/([^]+)(?=\/containers)/i)[1]); 

基本上,括號要捕獲​​和/containers

+0

我結束了使用卡西米爾的,但非常感謝您的快速回復! – Dankex 2014-09-25 00:53:35

+0

編輯:當我在所有的身體文字的結尾嘗試它時,它不工作... – Dankex 2014-09-25 00:58:58