Java 用于字符串获取不带空格的单词的正则表达式,但其中一部分可以包含空格

Java 用于字符串获取不带空格的单词的正则表达式,但其中一部分可以包含空格,java,regex,string,Java,Regex,String,起先:对不起标题,不知道更好。此外,我对正则表达式还相当陌生 我目前正在编程一个小东西,可以分析一个项目/武器的名称(来自游戏) 我想匹配像这样的名字: Windwalkers angry Leather Claws of Destruction 与以下比赛组: 风行者 愤怒的 皮爪 毁灭 项目名称具有命名方案: <> = required, [] = optional [itemgroup] [adjective] < material name with spaces &

起先:对不起标题,不知道更好。此外,我对正则表达式还相当陌生

我目前正在编程一个小东西,可以分析一个项目/武器的名称(来自游戏)

我想匹配像这样的名字:

Windwalkers angry Leather Claws of Destruction
与以下比赛组:

  • 风行者
  • 愤怒的
  • 皮爪
  • 毁灭
  • 项目名称具有命名方案:

    <> = required, [] = optional
    [itemgroup] [adjective] < material name with spaces > [of [source]]
    
    这根本不能处理某些部分是可选的,如果匹配组始终保持不变,那么2将始终是形容词,可能为空


    谢谢您的帮助。

    您可以将其分成一行:

    String[] parts = str.split("(?<!Leather|Steel|Wood(en)?|Glass|Iron|Bronze) (of )?");
    
    输出:

    [Windwalkers, angry, Leather Claws, Destruction]
    

    您可以将其拆分为一行中的各个部分:

    String[] parts = str.split("(?<!Leather|Steel|Wood(en)?|Glass|Iron|Bronze) (of )?");
    
    输出:

    [Windwalkers, angry, Leather Claws, Destruction]
    
    \[([a-z a-z]*)\]\s\[([a-z a-z]*)\]\s\[of\s\[([a-z a-z]*)\]\]
    
    这是正则表达式模式。我对您刚才提到的选项部分有点困惑,但是使用| calls或ors可能会对您提供的网站有所帮助

    ()称为组,您可以从中解析内容

    这个网站对regex来说太棒了

    编辑:对于可选部分,只需创建不同的正则表达式模式,如果其中一个模式失败,请创建另一个适合另一个模式的模式。

    \[([a-z a-z]*)\]\s\[([a-z a-z]*)\]\s\[of\s\[([a-z a-z]*)\]\]
    
    这是正则表达式模式。我对您刚才提到的选项部分有点困惑,但是使用| calls或ors可能会对您提供的网站有所帮助

    ()称为组,您可以从中解析内容

    这个网站对regex来说太棒了


    编辑:对于可选部分,只需创建不同的正则表达式模式,如果其中一个不符合ifelse,则创建另一个符合另一个模式的正则表达式。

    您不能真正使用正则表达式,因为无法判断第一个词是项目组、形容词还是材料名称的一部分。我认为regex方法是错误的。相反,请考虑创建允许的ITEM组的<代码>列表/CUT>,以及形容词的另一个<代码>列表< /代码>和一个用于材质名称的代码。如果
    input
    是输入名称:

    String work = input;
    for (String itemgroup : itemgroupList)
        if (work.startsWith (itemgroup.concat (" ")) {
            // itemgroup is now the item group you want
            work = work.substring (itemgroup.length()).trim();
            // remove itemgroup from the front of work, and discard leftover leading
            // spaces
        }
    

    这将测试当前字符串是否以itemgroup开头。如果是这样,它将从工作字符串中删除itemgroup,然后您可以对形容词和材质列表执行类似的操作。如果没有,则不会更改工作字符串,但可以查找形容词和材质。我唯一会使用正则表达式的是“of”部分。与尝试使用正则表达式做任何事情相比,这样做的优点是,您可以轻松地从任何允许的可能性列表中添加或删除项。(在输入结束时要小心;我上面的代码在
    itemgroup
    后面加了一个空格,因为我认为
    itemgroup
    后面必须跟一个空格,但材料名称并不总是这样。)

    你不能真正用正则表达式做你想做的事情,因为无法判断第一个单词是项目组、形容词还是材料名称的一部分。我认为regex方法是错误的。相反,请考虑创建允许的ITEM组的<代码>列表/CUT>,以及形容词的另一个<代码>列表< /代码>和一个用于材质名称的代码。如果
    input
    是输入名称:

    String work = input;
    for (String itemgroup : itemgroupList)
        if (work.startsWith (itemgroup.concat (" ")) {
            // itemgroup is now the item group you want
            work = work.substring (itemgroup.length()).trim();
            // remove itemgroup from the front of work, and discard leftover leading
            // spaces
        }
    

    这将测试当前字符串是否以itemgroup开头。如果是这样,它将从工作字符串中删除itemgroup,然后您可以对形容词和材质列表执行类似的操作。如果没有,则不会更改工作字符串,但可以查找形容词和材质。我唯一会使用正则表达式的是“of”部分。与尝试使用正则表达式做任何事情相比,这样做的优点是,您可以轻松地从任何允许的可能性列表中添加或删除项。(输入结束时要小心;我上面的代码在
    itemgroup
    后面加了一个空格,因为我认为
    itemgroup
    后面必须跟一个空格,但材料名称并不总是这样。)

    下面的正则表达式应该为您提供所需的值:

      ^(\w* )?(\w* )?(\w* \w*) of (\w*)$
    
    这里唯一重要的假设是项目名称(“Leather Claws”)中只有一个空格-如果不是这样,那么我认为使用正则表达式是不可能的。也就是说,在任何自动解析器上都很难处理这种情况,除非您的问题中没有提到固定的语法

    输入:
    风行者愤怒的皮革毁灭之爪

    输出:

  • 风行者
  • 愤怒的
  • 皮爪
  • 毁灭
  • 输入:
    风行者皮革毁灭之爪

    输出:

  • 风行者
  • 皮爪
  • 毁灭
  • 输入:
    皮革毁灭爪

    输出:

  • 皮爪
  • 毁灭
  • 这些是我能从您的问题中确定的唯一测试用例,但是它正确地解析了它们,甚至保留了相同的匹配组


    请参见

    中的演示,以下正则表达式应提供您所需的值:

      ^(\w* )?(\w* )?(\w* \w*) of (\w*)$
    
    这里唯一重要的假设是项目名称(“Leather Claws”)中只有一个空格-如果不是这样,那么我认为使用正则表达式是不可能的。也就是说,在任何自动解析器上都很难处理这种情况,除非您的问题中没有提到固定的语法

    输入:
    风行者