XQuery MarkLogic中的模式或格式匹配

时间:2018-05-17 19:22:17

标签: regex xquery marklogic

我正在寻找给定的字符串,它必须是*(*)格式,*不应该有空格,(之前不能有两个字。

我正在搜索MarkLogic数据库以查看给定的列值是否为[^\s]+\((?!\s)[^()]+(?<!\s)\)格式,如果没有用此格式替换它。

我仍然无法获取数据,并且无法编写查询以进行更新

我正在搜索DB

    let $query-opts := cts:search(doc(),
      cts:and-query((
        cts:directory-query(("/xyz/documentData/"),"1"),  
            cts:element-query( 
                xs:QName("cd:clause"),  (: <clause> element inside extended for checking query id :)
                cts:and-query((
                    cts:element-attribute-value-query( xs:QName("cd:clause"), xs:QName("tag"), "Title" ),  (: only if the <clause> is of type "Title" :)
                    cts:element-attribute-value-query( xs:QName("cd:xmetadata"), xs:QName("tag"), "Author")

                ))
             )
        ))
for $d in $query-opts
return (
     for $x in $d//cd:document/cd:clause/cd:xmetadata[fn:matches(@tag,"Author")]/cd:metadata_string
     where fn:matches($x/string(), "[^\s]+\((?!\s)[^()]+(?<!\s)\)")
       return 
       (   <documents> {
      <documentId> {$d//cd:cdf/cd:documentId/string()}</documentId>
     }</documents>
       )
     )

它抛出错误无效模式

1 个答案:

答案 0 :(得分:1)

fn:matches功能不支持(?!(?<!等组修饰符。如有必要,简化您的模式,并在匹配后捕获误报。

对你想要做的事情进行有根据的猜测,我认为你正在寻找类似的东西:

where fn:matches($x, '^.+\([^)]+\).*$') (: it uses parentheses :)
  and fn:not(fn:matches($x, '^[^\s]+\([^\s)]+\)$')) (: but does not comply to strict rules :)

HTH!