-2

特定の文字列の最小かつ一意の左右の文字列を検出するメカニズムを探しています。次のテキストを検討してください。

   <button id="allow" type="submit" class="button-big" name="allow" value="93db44648ab3607b10e600eaf796c794" tabindex="4">

value の値を取得する必要があります。したがって、選択することにした場合はsubstringname="allow" value="左の文字列と"右の文字列 (html データ全体の一意性に基づいて) とそれらの相対インデックスを使用します。w" value=".

私の質問は、これを見つける方法ですか?ツールのソースがないため、検出できません。

上記の HTML コードは簡単に理解できるようにするための単なる例であるため、C# やその他の HTML ライブラリの HAP について私に提案しないでください。私は他の種類のデータを持っています。

C# や Java のスニペットであれば何でも構いません。

編集:私が処理しているデータは非html、非標準ですが、チームが説明したものです。また、その性質上、Java でコーディングする必要もあります。したがって、HtmlAgilityPack については考えられません。

一意のパターンを識別するためのすべての機能の可能性よりも、最小限の文字列を重視したいと思います。

4

2 に答える 2

1

上記の例から、HTML を解析しようとしているように見えます...

そのためには、自分でやろうとするのではなく、 Html Agility Packを使用することをお勧めします。

于 2013-02-14T13:07:33.517 に答える
1

わかりました、あなたの最新のコメントから、私はあなたが何をしたいのかを推測しようとします。うまくいけば、正しい方向への指針を与えることができます.

一部のユーザーは、テキストを選択して、「最小区切り文字を自動検出します」と言います。したがって、入力はテキスト全体( type String) と、ユーザーの選択の開始インデックスと終了インデックス ( typeのselectionStartselectionEndint ) です。期待される出力は、テキスト全体で選択の開始と終了を一意に識別する 2 つの文字列になります (それらをstartDelimiterendDelimiterと呼びましょう)。

text.indexOf(startDelimiter, 0) + startDelimiter.length() == selectionStart

text.indexOf(endDelimiter, selectionStart) - 1 == selectionEnd

どちらも当てはまります。

startDelimiterを見つけるための一般的な方法は、 selectionStart - nからselectionStartまでの部分文字列を作成し、 n = 1から始めて、上記の最初の式が true になるまでnを増やします。endDelimiterについても同じことができますが、 selectionEnd + 1からselectionEnd + n + 1までの部分文字列を作成し、2 番目の式が true になるまでnを増やします。

区切り文字が大きくなる場合、これは遅くなる可能性があります。最悪の場合、selectionStartの前にある入力テキスト全体がstartDelimiterになり、 selectionStart - 1回の繰り返しの後にのみ検出されます。

したがって、可能性のある改善は、二分探索アプローチを使用し、有効な区切り文字が見つかるまで反復ごとにnを2倍にしてから、部分文字列が有効な区切り文字でなくなるまで同じ方法で区切り文字を減らすことです。その前の部分文字列は最小区切り文字です。

于 2013-02-14T15:02:08.363 に答える