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

如果你想在失败时立即中止,不如搜索错误的输入呢?以下搜索不符合您的条件的条目(超过三个字符,非 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 回答