具有多个标记的XML的正则表达式

时间:2016-04-01 21:21:28

标签: regex xml

我正在尝试查找不在XML标记内的所有文本:

<transcript>
  <text start="9.75" dur="5.94">welcome to about my property here you
can learn more about how your property</text>
  <text start="15.69" dur="4.71">was assessed see the information impact
has on file and compare your property to</text>
  <text start="20.4" dur="1.3">others in your neighborhood</text>
  <text start="21.7" dur="5.32">interested in learning about market
trends in your municipality no problem</text>
  <text start="105.79" dur="6.23">I have all of this and more about life property
. see your property assessment know more</text>
  <text start="112.02" dur="0.11">about</text>
</transcript>

我正在使用以下正则表达式模式,但显然它不正确,因为它抓取了开始和结束<transcript>标记之间的所有文本:

<transcript>[\s\S]*?<\/transcript>

如何修改此正则表达式模式以仅选择不在任何标记标记内的文本?

2 个答案:

答案 0 :(得分:1)

使用XSLT。 XSLT是一种专门设计用于将XML转换为另一种输出格式的语言(再次返回到有效的XML,或其他类似的东西,如(X)HTML,纯文本或任何其他格式 - 但最好是基于纯文本)。

在这种情况下,最小的XSLT就是这样:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0" >
<xsl:output method="text" indent="no" />

<xsl:template match="text">
    <!-- do NOTHING here! -->
</xsl:template>

</xsl:stylesheet>

这是有效的,因为处理单个XML标记的默认值是递归地将模板匹配应用于其包含的标记,并且将始终复制纯文本。 <template>中唯一的标记是<text>,您可以通过执行'无'来处理它 - 即,通过而不是将其内容复制到输出中。该模板中的行只是一个注释。

XML术语中的所有其他“节点”都是那些没有周围标记的节点,因此 被复制到输出中。

或者,如果您的标记类型不仅仅是<text>元素,并且您想要跳过所有标记,请将模板应用于/transcript以处理每个标记并应用另一个*(将选择未在其他地方指定的所有剩余标签)处理它们:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0" >
<xsl:output method="text" indent="no" />

<xsl:template match="/">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="transcript">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="*">
    <!-- do NOTHING here! -->
</xsl:template>

</xsl:stylesheet>

同样,简单的无标记文本将会通过而不会被处理,因此它们的内容将被复制到输出中。

两个XSLT样式表只会输出I ha,这是示例文本中唯一未被标记包围的部分。

答案 1 :(得分:0)

你想找到

吗?
welcome to about my property here you can learn more about how your property

<text start="9.75" dur="5.94">welcome to about my property here you can learn more about how your property</text>

...

它会起作用。

(?<=>).+?(?=<)