构建正则表达式以在href中查找id

时间:2008-11-17 21:21:48

标签: regex

有人可以向我展示一个正则表达式,该正则表达式将查看此文档,并选择每个结尾处有RELATION_ID的href的href值吗? 如果是,我必须得到问号之前的Id(例如href="dctm://ISDOFSDdev/ 37004e1f800021f3 ?DMS_OBJECT_SPEC=RELATION_ID“)

谢谢!

<?xml version="1.0" encoding="utf-8"?>
<?dctm xml_app="elearningContent"?>
<!DOCTYPE OnlineContent PUBLIC "-//ISDOFSD//DTD Online Content//EN" "file:C:/dmExport/New%20Folder%20(2)/ISDOFSDdev/elearningContent/OnlineContent.dtd">
<OnlineContent outputclass="Graphic Down" id="OnlineContent_955627C91D8743B98DCB8BD9BE379DE8">
    <title>Text and Popup</title>
    <OnlineContentBody>
        <lcInstruction id="lcInstruction_770F26218C064A84BFA1813562173970">
            <p>This is an example of a plain text screen with an attached popup.</p>
            <p>
                Popups are used to display additional content in a popup window. A <xref scope="local" type="topic" format="dita" href="dctm://ISDOFSDdev/37004e1f800021f3?DMS_OBJECT_SPEC=RELATION_ID">link is provided</xref> in the main text of the screen, which may clicked on to open a popup. A screen may contain <xref scope="local" type="topic" format="dita" href="dctm://ISDOFSDdev/37004e1f800021f4?DMS_OBJECT_SPEC=RELATION_ID">more than one popup</xref>.
            </p>
        </lcInstruction>
    </OnlineContentBody>
    <OnlinePopup id="OnlinePopup_AFE53E2CACBF4D8196E6360D4DDB6B70">
        <title>A Popup</title>
        <OnlinePopupBody>
            <p>This is an example of popup content.</p>
            <p>A popup may contain one or more paragraphs of text. They may also contain lists, like this:</p>
            <ul id="ul_7812991BBBDD4995B7499A9557C4EA9C">
                <li id="li_E83BDB28EC494B98BFF3DD5924AF855E">An item in a list</li>
                <li id="li_270F2A3A85BA4E6EBF98CB4023344475">Another item in a list</li>
            </ul>
            <p>A numbered list is demonstrated in the second popup.</p>
        </OnlinePopupBody>
    </OnlinePopup>
    <OnlinePopup id="OnlinePopup_5AE081BFB97043CE99F39A9E4A063332">
        <title>Another Popup</title>
        <OnlinePopupBody>
            <p>This is the second popup on this screen, containing a numbered list.</p>
            <ol id="ol_EF18C080E7CC40B7998DEB75772367A6">
                <li id="li_91B42F1B886B4CF887C001577C14B3F0">An item in a list</li>
                <li id="li_95C4F32E093843FAB985A3F6981A7D07">Another item in a list</li>
            </ol>
        </OnlinePopupBody>
    </OnlinePopup>
</OnlineContent>

7 个答案:

答案 0 :(得分:4)

您可以使用此正则表达式:

[a-fA-F0-9]+(?=\?DMS_OBJECT_SPEC=RELATION_ID)

匹配查询字符串之前的十六进制数。

我还建议使用XPath在正则表达式上执行此操作。

答案 1 :(得分:3)

由于您拥有XML数据,为什么不使用XSLT样式表?此示例选择所需属性的值。此示例仅使用有限的XPath 1.0函数。它输出所需href属性的值。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        >
        <xsl:output method="text" indent="no"/>
        <xsl:template match="*[@href]">
            <xsl:if test="contains(@href, 'RELATION_ID')">
                <xsl:value-of select="@href"/>
            <xsl:text>&#xa;</xsl:text>
            </xsl:if>
            <xsl:apply-templates select="*"/>
        </xsl:template>
        <xsl:template match="*">
            <xsl:apply-templates select="*"/>
        </xsl:template>
</xsl:stylesheet>

考虑到您将“example.xml”命名为给定文件,并将“example-xslt.xsl”命名为XSLT样式表,您可以使用以下行将结果保存到使用MSXSL.exe的文件“out.txt” :

C:\Documents and Settings\fer\Escritorio>msxsl.exe -xw example.xml example-xslt.xsl > out.txt

编辑:接下来是使用XPath v2.0的XSLT,让你在字符串处理功能中使用正则表达式的强大功能。结果是您要查找的URL内部的ID(而不是href属性的整个值)。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fn="http://www.w3.org/2005/xpath-functions" >
        <xsl:output method="text" indent="no"/>
        <xsl:template match="*[@href]">
            <xsl:if test="fn:contains(@href, 'RELATION_ID')">
                <xsl:value-of select="fn:replace(@href,'.*/([^/]*)\?.*', '$1')"/>
                <xsl:text>&#xa;</xsl:text>
            </xsl:if>
            <xsl:apply-templates select="*"/>
        </xsl:template>
        <xsl:template match="*">
            <xsl:apply-templates select="*"/>
        </xsl:template>
</xsl:stylesheet>

那里没有很多免费的XSLT v2.0处理器,但AltovaXML-2008就是其中之一。以下命令行为您提供了预期的结果。

C:\Documents and Settings\fer\Escritorio>AltovaXML -xslt2 example-xslt.xsl -in example.xml

答案 2 :(得分:1)

类似于:href=".*/([^"?/]*)?[^"]*RELATION_ID[^"]*"。这假设您在为属性使用双引号时保持一致。这应该是perl&amp; java友好。

([^"?/]*)将捕获斜杠和问号之间的位。在java中,您可以使用Matcher.group(int)来获取值。如果您尝试从同一文档中获取多个值,请查看Matcher.find(int)

答案 3 :(得分:1)

使用普通的正则表达式攻击它可能不明智。具有内置url-parsing功能的XPath可能是更好的解决方案。

如前所述,最佳解决方案取决于您使用的语言。

答案 4 :(得分:1)

也许是这样的 HREF = “(。+?)/(。+?)\?(。+?)RELATION_ID” 如果您只查找id部分(在您的示例中为37004e1f800021f3),请使用第二场比赛

答案 5 :(得分:1)

这是一个python解决方案:

expr = re.compile('href=.*?/(.*?)\?.*?=RELATION_ID', re.MULTILINE)

for x in expr.finditer(test_string): # iterate through all matches
   s = x.group(1) # get the one and only group of the match
   ss = s.split("/") # split off the ISDOFSDdev
   s = ss[len(ss) - 1] # grab the last element
   print s # print it

输出test_string是您发布的字符串:

37004e1f800021f3
37004e1f800021f4

同样这是在python中,但是对于任何现代正则表达式库,你应该能够复制它。

获取一个只提取ID的正则表达式是非常困难的。我并不是说这是不可能的,但通常更容易接近正则表达式,然后从正则表达式给你的子串中分离出你需要的东西。

python正则表达式模块上的

Documentation

答案 6 :(得分:0)

首先使用此正则表达式找到href属性:href =“[^ =] * = RELATION_ID”

获得这些属性的集合后,使用以下正则表达式来查找ID:dctm:[^?] *

第一个正则表达式的解释

href =“:匹配字符”href =“”字面上 [^ =] *:在零和无限次之间匹配任何非“=”的字符 = RELATION ___ ID:字面上匹配字符“= RELATION_ID”。

第二个正则表达式的解释

dctm ::匹配字符“dctm:”字面上 [^?] *:匹配任何不是“?”的字符在零和无限时间之间。

如果你打算经常使用正则表达式,你应该强烈考虑在http://www.regexbuddy.com/购买Regex Buddy