1

PDFドキュメントから抽出されたコンテンツページを解析するために正規表現を使用してJavaコードを書いています。

文字列では、正規表現は一致する必要があります: 数字 (最大 3 つ) の後にスペース (または多数) が続き、その後に単語 (または多数の [単語: 任意の文字列]) が続きます。逆もまた同様です: (word(s) space(s) digit(s)), それらはすべて文字列に含まれている必要があります. また、先頭のスペースを考慮し、大文字と小文字を区別しません。

抽出されたコンテンツ ページは次のようになります。

取締役の責任 8

コーポレート・ガバナンス 9

報酬レポート 10

番号付けスタイルは一貫しておらず、数字と文字列の間のスペースの数はさまざまであるため、次のようにもなります。

01 目次

02 戦略とハイライト

04 会長挨拶

私が使用している正規表現は、任意の数の単語の後に任意の数のスペースが続き、次に 3 桁以下の数字に一致します。

(?i)([a-z\\s])*[0-9]{1,3}(?i)

それは機能しますが、うまくいきません。何が間違っているのかわかりませんか? そして、正規表現を繰り返して順序を反転する代わりに、両方の番号付けスタイル (文字列の左または右にページ番号を持つ) を検出する方法があればいいのにと思います。

乾杯

4

2 に答える 2

1

フレーズを一致させたい場合は、一致させたい句読点を正規表現に含める必要があります。私の知る限り、正規表現ではフレーズが「前または後」であるかどうかを判断する方法がないため、1 つを反転して . を追加する必要があります|。次のようなもの:

[a-zA-Z'".,!\s]+\d{1,3}|\d{1,3}[a-zA-Z'".,!\s]+

また、(?i)正規表現は文字列の末尾まで、または(?-i).

于 2013-07-31T18:32:44.920 に答える
1

各項目の前後に常に数字がある場合、このパターンを複数行モードで使用できます。

"^(?:(?<nb1>\\d{1,3}) +)?(?<item>\\S+(?: +\\S+)*?)(?: +(?<nb2>\\d{1,3})|$)"

m.group('nb1')+m.group('nb2')次に、常に一致全体の数を取得するために使用できます。

ただし、少なくとも数字があることを確認する必要がある場合は、パターン全体を繰り返す必要があります。

"^(?:(?<nb1>\\d{1,3}) +(?<item1>\\S+(?: +\\S+)*)|(?<item2>\\S+(?: +\\S+)*) +(?<nb2>\\d{1,3})$"

それで:

item = m.group('item1')+m.group('item2');
nb = m.group('nb1')+m.group('nb2');

注意: パターンは最初と最後に固定されているため、それらを機能させるためにオプションのスペースを追加する必要がある可能性があります^\\s*:\\s*$

于 2013-07-31T18:49:43.283 に答える