正则表达式,如何首先中止失败?

时间:2013-08-14 07:06:47

标签: java regex abort

我有以下字符串:

 "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来测试我的正则表达式。

1 个答案:

答案 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)