【问题标题】:XPath to solve regex violationXPath 解决正则表达式违规
【发布时间】:2018-03-16 14:21:13
【问题描述】:

由于@kjhughes 在我上一个问题Regex repeat expression 中的精彩评论和链接到精彩帖子Never parse markup with regex 在我的应用程序中,我一直在更改尽可能多的不需要的正则表达式,通过编写完整的 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 抓取的信息,并且不会伤害不圣洁的孩子 :)

【问题讨论】:

标签: c# html regex xpath


【解决方案1】:

假设您提供的 XPath 的 text() 值为“Name: Herr FirstName LastName”

这是一个示例,说明如何在 XPath 2.0 语句中使用正则表达式来选择 text() 节点(如果它包含“Herr”或“Frau”),使用 matches()(当前不支持正前瞻和负后瞻) ,然后使用带有正则表达式的replace() 与捕获组的text() 节点值一起选择值“First Last”

//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')

【讨论】:

    【解决方案2】:

    作为Wiktor Stribiżew comments,您不必避免在XML 中的纯文本 上使用正则表达式——它是不应通过正则表达式解析的标记

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

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

    substring(normalize-space( 你的 XPath 在这里 ), 12)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多