XPath解决正则表达式违规

时间:2018-03-16 14:21:13

标签: c# html regex xpath

自上一个问题Never parse markup with regex中@kjhughes的精彩帖子Regex repeat expression发表了精彩评论和链接 我一直在改变我的应用程序中不需要的正则表达式,我用它来删除内容而不是编写完整的XPath。

但是对于以下内容我想知道是否还有一种方法可以用XPath解决它:

数据Name: Herr FirstName LastName

到目前为止

XPath://body//div/div/table/tr/td/div/table/tr[3]/td/div/table/tr/td/p[1]/span/text()

这里我使用以下正则表达式:(?<=Herr |Frau ).*

这是因为我只想要数据Firstname LastName我再次要求一个名字的原因是这是两个不同的邮件,我正在使用不同的模板,并希望应用程序是模块化的。

目前我在应用程序中经常执行此操作,我只是使用正则表达式删除所有不需要的文本,因此我想知道XPath是否也可以。这样我就可以了解更多有关XPath抓取的信息,并且不会伤害邪恶的孩子:)

2 个答案:

答案 0 :(得分:2)

假设您提供的XPath的text()值是&#34;名称:Herr FirstName LastName&#34;

以下示例说明如何在XPath 2.0语句中使用正则表达式来选择text()节点,如果它包含&#34; Herr&#34;或者&#34; Frau&#34;使用matches()(当前不支持正向前瞻和负向后瞻),然后使用replace()text()节点值上使用正则表达式与捕获组一起选择值&#34;最后一个&#34;

//body//div/div/
  table/tr/td/div/
  table/tr[3]/td/div/
  table/tr/td/p[1]/
  span/text()[matches(., "Herr|Frau ")]/replace(.,'.*Herr|Frau (.*)', '$1')

答案 1 :(得分:0)

作为Wiktor Stribiżew comments,您无需避免在XML上使用纯文本上的正则表达式 - 它的标记这不应该是&#39;通过正则表达式解析。

Mads Hansen shows如何在XPath 2.0中使用正则表达式。

如果您只有XPath 1.0,那么这是一种提取目标文本的方法:

substring(normalize-space( 您的XPath ), 12)