0

次の文字列があります。

 "xya", "yyy", "zzz",  'x', new ItemStack(Item.stick, 1, 0) , 'y', new ItemStack(Item.stick, 1, 0) , 'z', new ItemStack(Block.stone, 1, 0)

私は、ユーザーが間違った入力を挿入しないようにする正規表現を作成しようとしています (コンパイラのようにそうではありませんか?)。

私が最初に一致させようとしているのは「xya」です。この二重引用符グループ内には、x/y/z の文字または 3 文字以内の空白のみを含めることができます。したがって、有効な入力は次のようになります: "xxx" または "xyz" または "x " (はい、これは Minecraft のレシピです)。

これは私がこれまで持っている正規表現です:

\s*([\"][xyz]{3}[\"][,])

, "yyy"、および に一致"zzz",しますが、「xya」は有効な入力ではないため中止してほしいのですが、エンジンはすべての文字列を検索し続けます。

Rad Software Regular Expression Designer最初に正規表現をテストするために使用しています。

4

1 に答える 1

1

失敗したときにすぐに中止したい場合は、代わりに不正な入力を検索してみてはどうでしょうか? 次の例では、基準を満たさないエントリ (3 文字以上、x/y/z 以外、null) を検索します。

"(|[\w\s]{4,}|[\w]{0,2}[^xyz][\w]{0,2})"

悪い入力をキャッチするいくつかの例:

$ grep -P '"(|[\w\s]{4,}|[\w]{0,2}[^xyz][\w]{0,2})"' user_input.txt
"xya", "yyy", "zzz",  'x', new ItemStack(Item.stick, 1, 0) , 'y', new ItemStack(Item.stick, 1, 0) , 'z', new ItemStack(Block.stone, 1, 0)
"xxxx", "yyy", "zzz",  'x', new ItemStack(Item.stick, 1, 0) , 'y', new ItemStack(Item.stick, 1, 0) , 'z', new ItemStack(Block.stone, 1, 0)
"xxx", "yag", "zzz",  'x', new ItemStack(Item.stick, 1, 0) , 'y', new ItemStack(Item.stick, 1, 0) , 'z', new ItemStack(Block.stone, 1, 0)
"xxx", "yyy", "zzo",  'x', new ItemStack(Item.stick, 1, 0) , 'y', new ItemStack(Item.stick, 1, 0) , 'z', new ItemStack(Block.stone, 1, 0)
"(", "yxy", "yzz",  'x', new ItemStack(Item.stick, 1, 0) , 'y', new ItemStack(Item.stick, 1, 0) , 'z', new ItemStack(Block.stone, 1, 0)
"", "yxy", "yzz",  'x', new ItemStack(Item.stick, 1, 0) , 'y', new ItemStack(Item.stick, 1, 0) , 'z', new ItemStack(Block.stone, 1, 0)

一致しないもの (つまり、適切な入力) を確認する例:

$ grep -vP '"(|[\w\s]{4,}|[\w]{0,2}[^xyz][\w]{0,2})"' user_input.txt
"xxx", "yyy", "zzz",  'x', new ItemStack(Item.stick, 1, 0) , 'y', new ItemStack(Item.stick, 1, 0) , 'z', new ItemStack(Block.stone, 1, 0)
"x", "yxy", "yzz",  'x', new ItemStack(Item.stick, 1, 0) , 'y', new ItemStack(Item.stick, 1, 0) , 'z', new ItemStack(Block.stone, 1, 0)
于 2013-09-05T21:28:59.897 に答える