2

この質問で提案されているようなことをしたいと思いますが、より一般的なレベルでは: 頭字語の正規表現

入力例:

「影響力のある一連の論文で、Feddersen と Pesendorfer (1996, 1999)、以下FPを組み込む ... は、今後SVCで「<strong>スイング有権者の呪い」とラベル付けされています。予測 ... 最良の方法Static Application Security Testing ( SAST ) ツールの使用を開始するには..ラテン語のante meridiem ( AM ) から来て、正午までに..."

結果:

  1. [「フェダーセンとペゼンドルファー」、「FP」]
  2. [「スイング有権者の呪い」、「SVC」]
  3. [「静的アプリケーション セキュリティ テスト」、「SAST」]
  4. ['アンテメリディエム'、'AM']

もちろん、頭字語には多くの「シグナル」が考えられます。以下にいくつかをリストしました。

  • 括弧: ... (...)
  • …これから…
  • ... 今後 ...
  • ... この後 ...
  • ... と呼ばれる ...
  • ...続いて...
  • ...だから...
  • ...これから...
  • ... 以下〜とする ...

おそらく、2 つの正規表現を使用すると便利です。1 つは括弧用で、もう 1 つは他のすべてのものです。これは、構造がかなり異なるためです。

最初の文字の頭字語のみに焦点を当てています。SOUND Navigation And Raningから作成されたソナーなどのケースは無視します。

正規表現でそのような考えをすることは可能ですか?もしそうなら、どうしますか?

4

1 に答える 1

1

はい

可能です。最初に、頭字語の定義(SOWFBAAD) が後に続く一連の単語を記述する個々のルールをすべて定義し、次にこれらのルールを define ステートメントでつなぎ合わせます。

たとえば、電子メール アドレスを探している場合、この Perl Compliant Regular Expression (PCRE) を使用できます。この Perl Compliant Regular Expression (PCRE) は、最初に RFC 5322 のすべてのルールを定義し、次に電子メール アドレスのようなものを探します。

(?x)
    (?(DEFINE)

        (?<addr_spec> (?&local_part) @ gbase\.tt )
        (?<local_part> (?&dot_atom) | (?&quoted_string) | (?&obs_local_part) )
        (?<domain> (?&dot_atom) | (?&domain_literal) | (?&obs_domain) )
        (?<domain_literal> (?&CFWS)? \[ (?: (?&FWS)? (?&dtext) )* (?&FWS)? \] (?&CFWS)? )
        (?<dtext> [\x21-\x5a] | [\x5e-\x7e] | (?&obs_dtext) )
        (?<quoted_pair> \\ (?: (?&VCHAR) | (?&WSP) ) | (?&obs_qp) )
        (?<dot_atom> (?&CFWS)? (?&dot_atom_text) (?&CFWS)? )
        (?<dot_atom_text> (?&atext) (?: \. (?&atext) )* )
        (?<atext> [a-zA-Z0-9!#$%&''*+/=?^_`{|}~-]+ )
        (?<atom> (?&CFWS)? (?&atext) (?&CFWS)? )
        (?<word> (?&atom) | (?&quoted_string) )
        (?<quoted_string> (?&CFWS)? "" (?: (?&FWS)? (?&qcontent) )* (?&FWS)? "" (?&CFWS)? )
        (?<qcontent> (?&qtext) | (?&quoted_pair) )
        (?<qtext> \x21 | [\x23-\x5b] | [\x5d-\x7e] | (?&obs_qtext) )

        # comments and whitespace
        (?<FWS> (?: (?&WSP)* \r\n )? (?&WSP)+ | (?&obs_FWS) )
        (?<CFWS> (?: (?&FWS)? (?&comment) )+ (?&FWS)? | (?&FWS) )
    #   (?<ccontent> (?&ctext) | (?&quoted_pair) )
        (?<ccontent> (?&ctext) | (?&quoted_pair) | (?&comment) )
        (?<ctext> [\x21-\x27] | [\x2a-\x5b] | [\x5d-\x7e] | (?&obs_ctext) )

        # obsolete tokens
        (?<obs_domain> (?&atom) (?: \. (?&atom) )* )
        (?<obs_local_part> (?&word) (?: \. (?&word) )* )
        (?<obs_dtext> (?&obs_NO_WS_CTL) | (?&quoted_pair) )
        (?<obs_qp> \\ (?: \x00 | (?&obs_NO_WS_CTL) | \n | \r ) )
        (?<obs_FWS> (?&WSP)+ (?: \r\n (?&WSP)+ )* )
        (?<obs_ctext> (?&obs_NO_WS_CTL) )
        (?<obs_qtext> (?&obs_NO_WS_CTL) )
        (?<obs_NO_WS_CTL> [\x01-\x08] | \x0b | \x0c | [\x0e-\x1f] | \x7f )

        # character class definitions
        (?<VCHAR> [\x21-\x7E] )
        (?<WSP> [ \t] )
    )
    ((?&addr_spec))

もちろん、この式は正規表現の多くのフレーバーでうまく機能しない再帰を使用します。これを解決するには、単に ccontent をコメントアウトし、他の ccontent のコメントを外して、式が再帰的なコメントを検出しないことを受け入れることができます。

でも

これを正規表現だけで構成すると、後で読み取り、デバッグ、または変更するのが非常に困難な式になる可能性があります。したがって、SOWFBAAD 定義のリストをループする方がよいでしょう。

于 2013-08-20T15:52:19.363 に答える