2

正規表現の問題があります

その文字列に誤りがないかどうかを確認するために、定義済みの文字列を指定してユーザーを検証する必要があります。テストの下に単体テストを作成して、一致する必要がある文字列と一致しない文字列を確認できるようにしました。私がすでに持っていて、ほとんどの場合に機能するもの:

/^product:\[(.*?)\]|default:\[(.*?)\]$/

まだテストする必要があるのは、[] と | の間の値にカウントされない空白があってはならないことです。そこにいる必要があります。しかし、最後ではありません

return array(
        array(
            'default:[6_400]',
            TRUE
        ),
        array(
            'default:[bla_bla]',
            TRUE
        ),
        array(
            'default:[bla _ bla]',
            TRUE
        ),
        array(
            'product:8[8_400]|default:[6_400]',
            TRUE
        ),
        array(
            'product:8[8_400]|default:[6_400]|product:10[10_400]',
            TRUE
        ),
        array(
            'product:8[8_400]|product:12 [12_400]|default:[6_400]',
            FALSE
        ),
        array(
            'roduct:8[8_400]|product:12[12_400]|default[6_400',
            FALSE
        ),
        array(
            'default:6_400',
            FALSE
        ),
        array(
            'product:8[8_400]',
            FALSE
        ),
        array(
            'product:8[8_400]default:[6_400]',
            FALSE
        ),
        array(
            'product:8[8_400]|default:[6_400]|',
            FALSE
        ),
    );
4

2 に答える 2

1

あなたの例を見ると、角かっこ内に単語の文字やスペースが必要なことを意味していると思います(おそらく#$%^ &&、nullなどは必要ありません)...

\[[\w\s]+\]

これは明らかに、product:numberまたはdefault:のいずれかで処理できます。

((product:\d+)|(default:))(\[[\w\s]+\])

句は|で区切る必要があります ただし、一致する文字列は「|」で終わってはなりません。

((product:\d+)|(default:))(\[[\w\s]+\])(\|(?!$)|$)

これは1回以上発生する可能性があります

(((product:\d+)|(default:))(\[[\w\s]+\])(\|(?!$)|$))+

そして、少なくとも1つの完全な法的デフォルト条項が必要です。

(?=.*?default:\[[\w\s]+\])(((product:\d+)|(default:))(\[[\w\s]+\])(\|(?!$)|$))+

行全体を埋めます:

^(?=.*?default:\[[\w\s]+\])(((product:\d+)|(default:))(\[[\w\s]+\])(\|(?!$)|$))+$

ここで動作していますhttp://regexr.com?3275i

角かっこ以外の場所に空白を許可するパターンを含めていないため、角かっこ以外の場所で空白を禁止するために特別なことを行う必要はありません。

また、(単純さ/読みやすさのために)多くのキャプチャグループを作成しましたが、?:を後に配置することでそれらを削除できます(キャプチャしたくない。これにより、パフォーマンスがいくらか向上します。regexr.comでのテストに加えて、このサイト正規表現の学習/構築に役立つことがよくあります。

http://www.regular-expressions.info/

于 2012-09-19T17:04:07.210 に答える
0

この正規表現を試してください:

/^(?=.*?default)(?:(?:product|default):\d*\[[^\]]*\](?:\|(?!$)|$))+$/

紅斑を見る

defaultに現れる可能性を排除したい場合は[]、Gabber が指摘したように、次を使用できます。

/^(?:product:\d*\[[^\]]*\]\|)?(?:default:\d*\[[^\]]*\](?:\|(?!$)|$))(?:product:\‌​d*\[[^\]]*\](?:\|(?!$)|$))?$/
于 2012-09-19T14:36:08.253 に答える