RegEx用于字符串获取没有空格的单词,但有一部分可以有空格

时间:2013-08-20 22:51:39

标签: java regex string

首先:抱歉标题,不知道更好。我也是正则表达式的新手。

我目前正在编写一些可以分析物品/武器名称的东西(来自游戏)。

我想匹配这样的名字:

Windwalkers angry Leather Claws of Destruction

包含以下匹配组:

  1. Windwalkers
  2. 愤怒
  3. 皮革爪子
  4. 销毁
  5. 项目名称具有命名方案:

    <> = required, [] = optional
    [itemgroup] [adjective] < material name with spaces > [of [source]]
    

    组,形容词和来源不包含任何空格。

    我想出了这个:

    (\w*) (\w*) (.+) of (.*)
    

    根本不处理某些部分是可选的,如果匹配组总是保持不变,那么它也会很好,所以2总是那个可能性为空白的形容词。

    感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

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

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

您可以根据需要添加任意数量的形容词。

这使用负面的后视来断言被拆分的空间前面没有形容词。可选(of )?消耗术语之间的“of”。


这是一个测试:

String str = "Windwalkers angry Leather Claws of Destruction";
String[] parts = str.split("(?<!Leather|Steel|Wood(en)?|Glass|Iron|Bronze) (of )?");
System.out.println(Arrays.toString(parts));

输出:

[Windwalkers, angry, Leather Claws, Destruction]

答案 1 :(得分:1)

你无法用正则表达式做你想要的事情,因为没有办法判断第一个单词是项目组,形容词还是材料名称的一部分。我认为正则表达式方法是错误的。相反,请考虑为允许的项目组创建List<String>,为形容词创建另一个List<String>,为材料名称创建一个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开头。如果是,则从工作字符串中删除itemgroup,然后您可以使用您的形容词和材料列表执行类似操作。如果没有,工作字符串不会更改,但您可以查找形容词和材料。我唯一使用正则表达式的是“部分”。尝试使用正则表达式执行所有操作的优点是,您可以轻松地从任何允许的可能列表中添加或删除项目。 (当你到达输入的末尾时要小心;我上面的代码在itemgroup附加了一个空格,因为我认为{{1}}必须跟一个空格,但这并不总是材料名称的情况。)

答案 2 :(得分:1)

以下正则表达式应该为您提供您所追求的值:

  ^(\w* )?(\w* )?(\w* \w*) of (\w*)$

这里唯一重要的假设是项目名称中只有一个空格('皮革爪') - 如果不是这样,那么我不相信这是可能的,因为使用正则表达式。也就是说,任何自动解析器都难以处理这种情况,除非你的问题没有提到固定的语法。

输入: Windwalkers angry Leather Claws of Destruction

<强>输出:

  1. Windwalkers
  2. 愤怒
  3. 皮革爪子
  4. 销毁
  5. 输入: Windwalkers Leather Claws of Destruction

    <强>输出:

    1. Windwalkers
    2. &LT;空白&GT;
    3. 皮革爪子
    4. 销毁
    5. 输入: Leather Claws of Destruction

      <强>输出:

      1. &LT;空白&GT;
      2. &LT;空白&GT;
      3. 皮革爪子
      4. 销毁
      5. 这些是我可以从您的问题中确定的唯一测试案例,但它会正确解析它们甚至保留相同的匹配组。

        请参阅http://www.rubular.com/r/7AT4kDVf8S

        上的演示

答案 3 :(得分:0)

\[([a-z A-Z]*)\]\s\[([a-z A-Z]*)\] <(.*)\>\s\[of\s\[([a-z A-Z]*)\]\] 

这是正则表达式模式。我对你所谈论的选项部分有点困惑,但使用了|打电话或许可以帮助你和我提供的网站。

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

这个网站对正则表达式来说太棒了!

http://www.debuggex.com/

编辑:对于可选部分,只需制作不同的正则表达式模式,如果一个失败,则ifelse到另一个适合另一个模式的模式。