Создайте регулярное выражение, чтобы найти идентификатор в href - PullRequest
2 голосов
/ 18 ноября 2008

Может ли кто-нибудь показать мне регулярное выражение, которое просматривало бы этот документ и выбирало значение href для каждого href с RELATION_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 ]

4 голосов
/ 18 ноября 2008

Вы можете использовать это регулярное выражение:

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

, который соответствует шестнадцатеричному номеру непосредственно перед строкой запроса.

Я бы также предложил использовать XPath, чтобы сделать это через регулярные выражения.

3 голосов
/ 18 ноября 2008

Поскольку у вас есть данные 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, вы можете использовать следующую строку для сохранения результата в файл "out.txt", используя MSXSL. ехе

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

Редактировать: Далее идет XSLT с использованием XPath v2.0, который позволяет использовать мощь регулярных выражений внутри функций обработки строк. Результатом является идентификатор внутри URL, который вы искали (вместо целого значения атрибутов 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
1 голос
/ 18 ноября 2008

Вот решение 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, но с любой современной библиотекой регулярных выражений вы сможете ее воспроизвести.

Чрезвычайно сложно получить регулярное выражение, которое просто вытащит идентификатор. Я не говорю, что это невозможно, но часто легче подобраться к регулярному выражению, а затем выделить то, что вам нужно, из подстроки, которую дает регулярное выражение.

Документация в модуле регулярных выражений python.

1 голос
/ 18 ноября 2008

может быть как то так HREF = "(. +?) / (. +?) \? (. +?) RELATION_ID" и используйте второе совпадение, если вы ищете только часть id (37004e1f800021f3 в вашем примере)

1 голос
/ 18 ноября 2008

Возможно, было бы неразумно атаковать это с помощью простого старого регулярного выражения. XPath со встроенной функцией парсинга URL может быть лучшим решением.

Как указывалось ранее, лучшее решение зависит от языка, который вы используете.

1 голос
/ 18 ноября 2008

Что-то вроде: href=".*/([^"?/]*)?[^"]*RELATION_ID[^"]*". Это предполагает, что вы используете последовательные кавычки для своих атрибутов. Это должно быть дружественным к Perl и Java.

([^"?/]*) фиксирует бит между косой чертой и знаком вопроса. В Java вы должны использовать Matcher.group(int) для получения значения. Если вы пытаетесь получить несколько значений из одного и того же документа, посмотрите на Matcher.find(int).

0 голосов
/ 18 ноября 2008

Сначала найдите атрибут href, используя это регулярное выражение: href = "[^ =] * = RELATION_ID"

Когда у вас есть коллекция этих атрибутов, используйте следующее регулярное выражение, чтобы найти идентификатор: dctm: [^?] *

Объяснение первого регулярного выражения

href = ": буквально сопоставить символы" href = ""
[^ =] *: Сопоставить любой символ, который НЕ является символом "=", от нуля до неограниченного времени
= ОТНОШЕНИЕ ___ ID: буквально совпадать с символами "= RELATION_ID".

Объяснение второго регулярного выражения

dctm :: Соответствует буквам символов "dctm:".
[^?] *: Соответствует любому символу, который НЕ является "?" от нуля до неограниченного времени.

Если вы собираетесь часто использовать регулярные выражения, вам настоятельно рекомендуется купить Regex Buddy по адресу http://www.regexbuddy.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...