1

Webページには、次のコンテンツを含むdivがあります-

<div id="test">
    <p> This is first sentence. This is second sentence. This is third sentence. This is 4th sentence. </p>
</div>

さて、上記のHTMLフラグメントから「これは2番目の文です」というテキストを取得するにはどうすればよいですか?このテキストが含まれているdiv/pに到達する方法は理解していますが、その特定の文のみを抽出する方法はありますか?

同様に、最初の3つの文を抽出するにはどうすればよいですか?また、最後の2つの文を選択するにはどうすればよいですか?最後に、Xquery式は、「。」などの任意のタイプの区切り文字に対して機能する必要があります。/ "、" / ";" 等...

4

3 に答える 3

3

ポイントで分割

fn:tokenize文字列を分解するために使用します。

fn:tokenize(//p, "[\.,;]")[2]

パターンは任意の有効な正規表現である可能性があり、ニーズに合わせて簡単に作成できます。正規表現の特殊文字に注意してください。

最初の3つの文には、次を使用しますfn:position

tokenize(//p, "[\.,;]")[position() le 3]

より一般的な分析には、範囲式を使用できます。

tokenize(//p, "[\.,;]")[position() = (2 to 3)]

より良い文認識

すべてのポイントが文を終了するわけではありません。より良い文の検出のために(それでもすべての場合に保存するわけではありませんが)、いくつかのregex-fooを行うことができます:

tokenize(//p, '(?<=[\.,;])\s+(?=\p{Lu})')[2]

これにより、上記のリストの文字が前にあり、その後に大文字が続くすべての空白文字(またはそれらが互いに続く場合は複数の文字)で分割されます。

警告:先読みと後読みはXQuery標準に含まれていないため、すべての実装でサポートされています。サポートされている場合でも、標準に違反して削除される可能性があるため、使用するのは安全でない可能性があります。これにはBaseX7.1.1を使用しました。

于 2012-07-28T14:27:06.527 に答える
2

さて、上記のHTMLフラグメントから「これは2番目の文です」というテキストを取得するにはどうすればよいですか?

tokenize(/div/p, '\\.')[2]

同様に、最初の3つの文を抽出するにはどうすればよいですか?

tokenize(/div/p, '\\.')[position() le 3]

また、最後の2つの文を選択するにはどうすればよいですか?

tokenize(/div/p, '\\.')[position() gt last() -2]

最後に、Xquery式は、「。」などの任意のタイプの区切り文字に対して機能する必要があります。/ "、" / ";" 等...

tokenize()次のような文字列の2番目の引数として使用します。'[.,;]'

于 2012-07-28T21:34:25.627 に答える
2

fn:replaceで正規表現を使用してグループをキャプチャするのはどうですか?

文字列=Dを手動でトークン化するのではなく、正規表現を使用することで、より悪いお尻を感じさせるという利点があります。

let $s := 'This is first sentence. This is second sentence. This is third sentence. This is 4th sentence.'

let $adjust-this-regex-as-needed := '([\w\s]+)\.([\w\s]+)\.([\w\s]+)\.([\w\s]+)\.'
return (
    fn:replace($s, $adjust-this-regex-as-needed , '$1'),     (: first sentence :)
    fn:replace($s, $adjust-this-regex-as-needed , '$2  $3')  (: last two sentences :)
)

([\ w \ s] +)\。->は、ピリオドまでのすべての文字とスペースに一致することを意味します

于 2012-07-29T09:16:36.163 に答える