【问题标题】:Regex for tokenize in xQueryxQuery 中用于标记化的正则表达式
【发布时间】:2012-07-24 23:38:15
【问题描述】:

使用 xPath 我得到这样的文本:

Sed id felis mi; Nam porta lacinia sapien vestibulum egestas; Praesent nec nisl purus,eget mollis metus。 Fusce euismod ante id Tellus tincidunt dignissim ornare magna blandit。 Nunc id risus quam。

我想把它分成两个变量:

var1 = 文本从开始到第一个点 => 如果这部分包含超过 10 个单词(以空格分隔)并包含分号';',那么它将从开始到第一个分号获取文本.

var2 = 文本的右侧部分。

我从这段代码开始,但它没有给我想要的东西(我还没有处理 10 个单词的条件):

let $left := data(tokenize($doc//div/blockquote/p/text(), '^(.*?)[;|.](.*?)$')[1])
let $right := data(tokenize($doc//div/blockquote/p/text(), '^(.*?)[;|.](.*?)$')[2])

提前致谢。

【问题讨论】:

    标签: regex xpath xquery tokenize


    【解决方案1】:

    试试这个

    for $p in doc('file:///c:/test.xml')//div/blockquote/p/text()
        return 
            if (count(tokenize(tokenize($p,'[.]')[1],'\s+')) gt 10) then
                (tokenize($p,'[.]')[1])
            else
                (tokenize($p,';')[1])
    

    参考见fn:tokenize

    【讨论】:

    • 两个返回值不应该改变位置吗?
    • 您的代码运行良好(根据我的需要稍作修改)。谢谢:-)
    【解决方案2】:

    即使不使用tokenize() 或任何正则表达式也可以完成:

       for $s in 'Sed id felis mi; Nam porta lacinia sapien vestibulum egestas; Praesent nec nisl purus, eget mollis metus. Fusce euismod ante id tellus tincidunt dignissim ornare magna blandit. Nunc id risus quam.',
           $vBeforeDot in substring-before($s, '.'),
           $vBeforeSemiC in substring-before($s, ';')
          return
             ($vBeforeDot
                           [string-length(normalize-space(.))
                           - string-length(translate(normalize-space(.), ' ', ''))
                           le 9
                           ],
            $vBeforeSemiC
            )[1]
    

    【讨论】:

    • +1,多么出色的 XPath 1.0 解决方案。希望我能对此给予更多投票。
    猜你喜欢
    • 2012-06-20
    • 2022-12-18
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    相关资源
    最近更新 更多