有人可以向我展示一个正则表达式,该正则表达式将查看此文档,并选择每个结尾处有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>
答案 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>
</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>
</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正则表达式模块上的答案 6 :(得分:0)
首先使用此正则表达式找到href属性:href =“[^ =] * = RELATION_ID”
获得这些属性的集合后,使用以下正则表达式来查找ID:dctm:[^?] *
第一个正则表达式的解释
href =“:匹配字符”href =“”字面上 [^ =] *:在零和无限次之间匹配任何非“=”的字符 = RELATION ___ ID:字面上匹配字符“= RELATION_ID”。
第二个正则表达式的解释
dctm ::匹配字符“dctm:”字面上 [^?] *:匹配任何不是“?”的字符在零和无限时间之间。
如果你打算经常使用正则表达式,你应该强烈考虑在http://www.regexbuddy.com/购买Regex Buddy