【问题标题】:Regex, How to abort at first fail?正则表达式,如何在第一次失败时中止?
【发布时间】:2013-08-14 07:06:47
【问题描述】:

我有以下字符串:

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

【问题讨论】:

  • 我想出了这个:\s*[\"]([xyz]+{1, 3}|[xyz]+\s{1,2})["]
  • 你最终打算将正则表达式用于什么? (哪种语言或环境)有些提供\G 锚,以确保所有匹配项都是相邻的。
  • Java。我已经有了这个程序,但我需要这个正则表达式来防止任何用户输入错误。

标签: java regex abort


【解决方案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)

【讨论】:

    猜你喜欢
    • 2022-12-03
    相关资源
    最近更新 更多