我有以下字符串:
"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
来测试我的正则表达式。
答案 0 :(得分: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)