似乎无法为特定案例制作正则表达式

时间:2014-09-24 23:44:55

标签: javascript xml regex node.js

我'使用节点,我需要将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>

从该文本中,我需要在应用程序容器之间提取ID,在这种情况下,等于 98191axla 。我尝试使用匹配方法这样做:

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

总是返回-1。我以前从未使用过正则表达式,所以我不得不尝试不同的东西......它们都没有用过。 任何帮助深表感谢!

谢谢! (顺便说一句,我知道它是一个xml表示,但它不是一个非常复杂的孩子,所以我认为操纵文本会更容易......)

3 个答案:

答案 0 :(得分:1)

您可以使用此代码:

var re = /<reference>gscl\/applications\/(\w+)\/containers\/DATA\/congtentInstances\/subscriptions<\/reference>/;
var m = str.match(re);
if (m) console.log(m[1]);

请注意,在斜杠之间声明了regexp对象(不将引号括在引号之间)。

该模式使用包含ascii数字和字母(以及下划线)的\w character class。此类之后是quantifier +,表示一个或多个。 最后,要隔离您需要的子字符串,使用capture group

答案 1 :(得分:0)

我不是正则表达式专家,但以下内容似乎适用于此数据集。

&#13;
&#13;
//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);
}
&#13;
<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>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

你可以这样做:

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

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

基本上,括号将捕获 /applications//containers

之间的文字