2

RegexLib から以下の正規表現を見つけました。

^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[13-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:
(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468]
[048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))
(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

http://regexlib.com/REDetails.aspx?regexp_id=113からです

この正規表現で何度も使われている「?:」という表記がわかりません。「:」がチャートシートにないようです

私は正規表現に精通しています。正規表現と入力を使用して、誰かが例を示すことができますか?

4

3 に答える 3

7

(?:...)は単なる非キャプチャ グループです。つまり、このグループに一致する文字列の一部は保存されず、$1またはによってアクセスできません。\1

キャプチャ グループは左括弧で番号付けされているため、

例のテキスト「Foobar test」の場合

  1. ここに2つのキャプチャグループがあります

    ^(\w+)\s*(\w+)
     1       2
    

    これにより、次のようになります。

    $1 = "Foobar"
    
    $2 = "test"
    
  2. キャプチャ グループは 1 つだけです。

    ^(?:\w+)\s*(\w+)
               1
    

    これにより、次のようになります。

    $1 = "test" 
    
于 2013-03-12T21:11:58.880 に答える
2

(?:...)つまり、演算子の優先順位を制御しますが、一致グループは作成されません。

于 2013-03-12T21:12:06.243 に答える
2
(?:)

は、非捕捉グループを表します。perldoc perlreを参照してください( は IMHO で最も高度な言語であり、REGEX を使用します。たとえば、Perl 互換正規表現PHPを意味し、 、pcregrepまたは withのデフォルトですgrep -P)

perl doc の関連部分:

(?:パターン)
(?adluimsx-imsx:パターン)
(?^aluimsx:パターン)

これはクラスタリングのためであり、キャプチャではありません。"()" のように部分式をグループ化しますが、"()" のように後方参照を作成しません。

を使用したこの例を参照してください。

$ echo 'azfoobar' | perl -lne 'print $1 if /^(?:az)(.*)/'
foobar

ご覧のとおり、最初に一致するキャプチャ グループ ( $1) はaz、行の残りの部分ではありません。などの他の言語でも同じように機能します。

于 2013-03-12T21:23:38.447 に答える